From 9e133d9527bef6edb31c90b7737b188dcf55f2d4 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Mon, 25 Aug 2025 22:22:00 -0300 Subject: [PATCH] feat: add terminal width detection using termsize Co-authored-by: aider (openai/andrew/openrouter/deepseek/deepseek-chat-v3.1) --- src/modes/list.rs | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/modes/list.rs b/src/modes/list.rs index 54aa8bb..c65c57c 100644 --- a/src/modes/list.rs +++ b/src/modes/list.rs @@ -11,6 +11,8 @@ use serde::{Deserialize, Serialize}; use serde_json; use serde_yaml; use std::env; +use std::io::{stdout, IsTerminal}; +use termsize; #[derive(Serialize, Deserialize)] struct ListItem { @@ -61,13 +63,26 @@ pub fn mode_list( } // Get terminal width once, default to 80 if not available - let columns_env = env::var("COLUMNS").ok(); - debug!("COLUMNS environment variable: {:?}", columns_env); - - let term_width = columns_env - .as_ref() - .and_then(|w| w.parse::().ok()) - .unwrap_or(80); + let term_width = if let Ok(columns_env) = env::var("COLUMNS") { + debug!("COLUMNS environment variable: {:?}", columns_env); + columns_env.parse::().unwrap_or(80) + } else if stdout().is_terminal() { + // Try to get terminal size using termsize + match termsize::get() { + Some(size) => { + let width = size.cols as usize; + debug!("Terminal size detected: {} columns", width); + width + } + None => { + debug!("Failed to get terminal size, defaulting to 80"); + 80 + } + } + } else { + debug!("Not a terminal, defaulting to 80"); + 80 + }; debug!("Terminal width: {}", term_width);