From f2f74a97d9069ab16c34c0763d41497489a63ffa Mon Sep 17 00:00:00 2001 From: sigoden Date: Sat, 14 Dec 2024 06:48:33 +0800 Subject: [PATCH] fix: don't trim the input text --- src/cli.rs | 7 +------ src/config/input.rs | 2 +- src/repl/mod.rs | 16 ++++++++++++---- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index c3af5cc2..2de6113c 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -73,12 +73,7 @@ pub struct Cli { impl Cli { pub fn text(&self) -> Option { - let text = self - .text - .iter() - .map(|x| x.trim().to_string()) - .collect::>() - .join(" "); + let text = self.text.to_vec().join(" "); if text.is_empty() { return None; } diff --git a/src/config/input.rs b/src/config/input.rs index 42bb8ec0..f1e6084c 100644 --- a/src/config/input.rs +++ b/src/config/input.rs @@ -91,7 +91,7 @@ impl Input { } for (path, contents) in files { texts.push(format!( - "============ PATH: {path} ============\n\n{contents}\n" + "============ PATH: {path} ============\n{contents}" )); } let (role, with_session, with_agent) = resolve_role(&config.read(), role); diff --git a/src/repl/mod.rs b/src/repl/mod.rs index cdca146e..ff12331b 100644 --- a/src/repl/mod.rs +++ b/src/repl/mod.rs @@ -280,7 +280,7 @@ impl Repl { Some(args) => match args.split_once(['\n', ' ']) { Some((name, text)) => { let role = self.config.read().retrieve_role(name.trim())?; - let input = Input::from_str(&self.config, text.trim(), Some(role)); + let input = Input::from_str(&self.config, text, Some(role)); ask(&self.config, self.abort_signal.clone(), input, false).await?; } None => { @@ -718,8 +718,9 @@ fn split_files_text(line: &str, is_win: bool) -> (Vec, &str) { word.to_string() } }; + let chars: Vec = line.chars().collect(); - for (i, char) in line.chars().enumerate() { + for (i, char) in chars.iter().cloned().enumerate() { match unbalance { Some(ub_char) if ub_char == char => { word.push(char); @@ -730,12 +731,15 @@ fn split_files_text(line: &str, is_win: bool) -> (Vec, &str) { } None => match char { ' ' | '\t' | '\r' | '\n' => { + if char == '\r' && chars.get(i + 1) == Some(&'\n') { + continue; + } if let Some('\\') = prev_char.filter(|_| !is_win) { word.push(char); } else if !word.is_empty() { if word == "--" { word.clear(); - text_starts_at = Some(i); + text_starts_at = Some(i + 1); break; } words.push(unquote_word(&word)); @@ -763,7 +767,7 @@ fn split_files_text(line: &str, is_win: bool) -> (Vec, &str) { words.push(unquote_word(&word)); } let text = match text_starts_at { - Some(start) => line[start..].trim(), + Some(start) => &line[start..], None => "", }; @@ -807,6 +811,10 @@ mod tests { split_files_text("file.txt -- hello", false), (vec!["file.txt".into()], "hello") ); + assert_eq!( + split_files_text("file.txt -- \thello", false), + (vec!["file.txt".into()], "\thello") + ); assert_eq!( split_files_text("file.txt --\nhello", false), (vec!["file.txt".into()], "hello")