@@ -39,12 +39,13 @@ use clap::{
3939 Args ,
4040 CommandFactory ,
4141 Parser ,
42+ ValueEnum ,
4243} ;
4344use cli:: compact:: CompactStrategy ;
4445use cli:: model:: {
46+ find_model,
4547 get_available_models,
4648 select_model,
47- find_model,
4849} ;
4950pub use conversation:: ConversationState ;
5051use conversation:: TokenWarningLevel ;
@@ -189,6 +190,16 @@ pub const EXTRA_HELP: &str = color_print::cstr! {"
189190 <black!>Change using: q settings chat.skimCommandKey x</black!>
190191" } ;
191192
193+ #[ derive( Copy , Clone , Debug , PartialEq , Eq , ValueEnum ) ]
194+ pub enum WrapMode {
195+ /// Always wrap at terminal width
196+ Always ,
197+ /// Never wrap (raw output)
198+ Never ,
199+ /// Auto-detect based on output target (default)
200+ Auto ,
201+ }
202+
192203#[ derive( Debug , Clone , PartialEq , Eq , Default , Args ) ]
193204pub struct ChatArgs {
194205 /// Resumes the previous conversation from this directory.
@@ -212,6 +223,9 @@ pub struct ChatArgs {
212223 pub no_interactive : bool ,
213224 /// The first question to ask
214225 pub input : Option < String > ,
226+ /// Control line wrapping behavior (default: auto-detect)
227+ #[ arg( short = 'w' , long, value_enum) ]
228+ pub wrap : Option < WrapMode > ,
215229}
216230
217231impl ChatArgs {
@@ -343,7 +357,9 @@ impl ChatArgs {
343357 // Fallback logic: try user's saved default, then system default
344358 let fallback_model_id = || {
345359 if let Some ( saved) = os. database . settings . get_string ( Setting :: ChatDefaultModel ) {
346- find_model ( & models, & saved) . map ( |m| m. model_id . clone ( ) ) . or ( Some ( default_model_opt. model_id . clone ( ) ) )
360+ find_model ( & models, & saved)
361+ . map ( |m| m. model_id . clone ( ) )
362+ . or ( Some ( default_model_opt. model_id . clone ( ) ) )
347363 } else {
348364 Some ( default_model_opt. model_id . clone ( ) )
349365 }
@@ -412,6 +428,7 @@ impl ChatArgs {
412428 tool_config,
413429 !self . no_interactive ,
414430 mcp_enabled,
431+ self . wrap ,
415432 )
416433 . await ?
417434 . spawn ( os)
@@ -621,6 +638,7 @@ pub struct ChatSession {
621638 interactive : bool ,
622639 inner : Option < ChatState > ,
623640 ctrlc_rx : broadcast:: Receiver < ( ) > ,
641+ wrap : Option < WrapMode > ,
624642}
625643
626644impl ChatSession {
@@ -640,6 +658,7 @@ impl ChatSession {
640658 tool_config : HashMap < String , ToolSpec > ,
641659 interactive : bool ,
642660 mcp_enabled : bool ,
661+ wrap : Option < WrapMode > ,
643662 ) -> Result < Self > {
644663 // Reload prior conversation
645664 let mut existing_conversation = false ;
@@ -731,6 +750,7 @@ impl ChatSession {
731750 interactive,
732751 inner : Some ( ChatState :: default ( ) ) ,
733752 ctrlc_rx,
753+ wrap,
734754 } )
735755 }
736756
@@ -2419,8 +2439,20 @@ impl ChatSession {
24192439 let mut buf = String :: new ( ) ;
24202440 let mut offset = 0 ;
24212441 let mut ended = false ;
2442+ let terminal_width = match self . wrap {
2443+ Some ( WrapMode :: Never ) => None ,
2444+ Some ( WrapMode :: Always ) => Some ( self . terminal_width ( ) ) ,
2445+ Some ( WrapMode :: Auto ) | None => {
2446+ if std:: io:: stdout ( ) . is_terminal ( ) {
2447+ Some ( self . terminal_width ( ) )
2448+ } else {
2449+ None
2450+ }
2451+ } ,
2452+ } ;
2453+
24222454 let mut state = ParseState :: new (
2423- Some ( self . terminal_width ( ) ) ,
2455+ terminal_width,
24242456 os. database . settings . get_bool ( Setting :: ChatDisableMarkdownRendering ) ,
24252457 ) ;
24262458 let mut response_prefix_printed = false ;
@@ -3340,6 +3372,7 @@ mod tests {
33403372 tool_config,
33413373 true ,
33423374 false ,
3375+ None ,
33433376 )
33443377 . await
33453378 . unwrap ( )
@@ -3482,6 +3515,7 @@ mod tests {
34823515 tool_config,
34833516 true ,
34843517 false ,
3518+ None ,
34853519 )
34863520 . await
34873521 . unwrap ( )
@@ -3579,6 +3613,7 @@ mod tests {
35793613 tool_config,
35803614 true ,
35813615 false ,
3616+ None ,
35823617 )
35833618 . await
35843619 . unwrap ( )
@@ -3654,6 +3689,7 @@ mod tests {
36543689 tool_config,
36553690 true ,
36563691 false ,
3692+ None ,
36573693 )
36583694 . await
36593695 . unwrap ( )
@@ -3705,6 +3741,7 @@ mod tests {
37053741 tool_config,
37063742 true ,
37073743 false ,
3744+ None ,
37083745 )
37093746 . await
37103747 . unwrap ( )
0 commit comments