diff options
| author | sigoden <sigoden@gmail.com> | 2025-01-23 17:36:38 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-23 17:36:38 +0800 |
| commit | c2d995b9e3ac7e3bbdb8b47531b865afcb074f12 (patch) | |
| tree | 98bedcd19db46ec8ee66b5edc9b4a7d0c464a066 /src/repl/completer.rs | |
| parent | 7567478754bfbc4b103b692c6b1574f80a8b453f (diff) | |
| download | aichat-c2d995b9e3ac7e3bbdb8b47531b865afcb074f12.tar.gz | |
refactor: fuzzy filter REPL autocompletions (#1120)
Diffstat (limited to 'src/repl/completer.rs')
| -rw-r--r-- | src/repl/completer.rs | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/src/repl/completer.rs b/src/repl/completer.rs index bcce694..1f4dcc7 100644 --- a/src/repl/completer.rs +++ b/src/repl/completer.rs @@ -1,6 +1,6 @@ use super::{ReplCommand, REPL_COMMANDS}; -use crate::{config::GlobalConfig, utils::fuzzy_match}; +use crate::{config::GlobalConfig, utils::fuzzy_filter}; use reedline::{Completer, Span, Suggestion}; use std::collections::HashMap; @@ -29,25 +29,21 @@ impl Completer for ReplCompleter { let state = self.config.read().state(); + let command_filter = parts + .iter() + .take(2) + .map(|(v, _)| *v) + .collect::<Vec<&str>>() + .join(" "); let commands: Vec<_> = self .commands .iter() .filter(|cmd| { - if !cmd.is_valid(state) { - return false; - } - let line = parts - .iter() - .take(2) - .map(|(v, _)| *v) - .collect::<Vec<&str>>() - .join(" "); - if line == "." { - return true; - } - line.starts_with(&cmd.name[..2]) && fuzzy_match(cmd.name, &line).is_some() + cmd.is_valid(state) + && (command_filter.len() == 1 || cmd.name.starts_with(&command_filter[..2])) }) .collect(); + let commands = fuzzy_filter(commands, |v| v.name, &command_filter); if parts_len > 1 { let span = Span::new(parts[parts_len - 1].1, pos); |
