diff options
| author | sigoden <sigoden@gmail.com> | 2023-10-24 17:45:49 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-24 17:45:49 +0800 |
| commit | b5e1460151451e124f5e80e0dbe670fff83899c0 (patch) | |
| tree | 92332262b6106ae4c2e455586d72d8d41b162700 /src | |
| parent | e09b39def951221358b55ae66badf0fd51a708fd (diff) | |
| download | aichat-b5e1460151451e124f5e80e0dbe670fff83899c0.tar.gz | |
feat: use backslash at end of line for multiline text (#147)
BREAKING CHANGE: use backslash at end of line for multiline text
```
〉.set dry_run true
〉abc \
def \
ijk
>>> The following message consumes 12 tokens.
abc
def
ijk
```
Deprecate old {}/() multi-line editing
Diffstat (limited to 'src')
| -rw-r--r-- | src/repl/mod.rs | 12 | ||||
| -rw-r--r-- | src/repl/validator.rs | 47 |
2 files changed, 2 insertions, 57 deletions
diff --git a/src/repl/mod.rs b/src/repl/mod.rs index 84f8175..2e68528 100644 --- a/src/repl/mod.rs +++ b/src/repl/mod.rs @@ -16,7 +16,6 @@ use crate::term; use anyhow::{Context, Result}; use reedline::Signal; -use std::borrow::Cow; use std::rc::Rc; pub const REPL_COMMANDS: [(&str, &str); 13] = [ @@ -86,7 +85,7 @@ impl Repl { } fn handle_line(&mut self, handler: &Rc<ReplCmdHandler>, line: &str) -> Result<bool> { - let line = clean_multiline_symbols(line); + let line = line.trim().replace("\\\n", "\n"); match parse_command(line.as_ref()) { Some((cmd, args)) => match cmd { ".exit" => { @@ -165,21 +164,12 @@ fn dump_repl_help() { print_now!( r###"{head} -Type `{{` to enter the multi-line editing mode, type '}}' to exit the mode. Press Ctrl+C to abort readline, Ctrl+D to exit the REPL "###, ); } -fn clean_multiline_symbols(line: &str) -> Cow<str> { - let trimed_line = line.trim(); - match trimed_line.chars().next() { - Some('{' | '[' | '(') => trimed_line[1..trimed_line.len() - 1].into(), - _ => Cow::Borrowed(line), - } -} - fn parse_command(line: &str) -> Option<(&str, Option<&str>)> { let mut trimed_line = line.trim_start(); if trimed_line.starts_with('.') { diff --git a/src/repl/validator.rs b/src/repl/validator.rs index d829911..1a5f405 100644 --- a/src/repl/validator.rs +++ b/src/repl/validator.rs @@ -6,55 +6,10 @@ pub struct ReplValidator; impl Validator for ReplValidator { fn validate(&self, line: &str) -> ValidationResult { - if incomplete_brackets(line) { + if line.ends_with('\\') { ValidationResult::Incomplete } else { ValidationResult::Complete } } } - -fn incomplete_brackets(line: &str) -> bool { - let mut balance: Vec<char> = Vec::new(); - let mut symbol = None; - for c in line.chars() { - match symbol { - Some(s) => match (s, c) { - ('{', '}') | ('(', ')') => { - balance.pop(); - } - _ if s == c => { - balance.push(c); - } - _ => {} - }, - None => match c { - '{' | '(' => { - balance.push(c); - symbol = Some(c); - } - _ => {} - }, - } - } - - !balance.is_empty() -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_incomplete_brackets() { - assert!(incomplete_brackets("{")); - assert!(incomplete_brackets("(")); - assert!(!incomplete_brackets("{}")); - assert!(!incomplete_brackets("()")); - assert!(!incomplete_brackets("{ab\nc}")); - assert!(!incomplete_brackets("(ab\nc)")); - assert!(!incomplete_brackets("{[}")); - assert!(!incomplete_brackets("{{{{{}}}}}")); - assert!(incomplete_brackets("{{}")); - } -} |
