summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2024-07-12 20:25:06 +0800
committerGitHub <noreply@github.com>2024-07-12 20:25:06 +0800
commit3360cfaf235e3106cd32ec32d5979144e941f818 (patch)
treebf3b9f871cc4e9ab6dd71b340e9d1c7ee3a6f828
parentcfcf624e3be72364b4c3123e4f48be559f1edb40 (diff)
downloadaichat-3360cfaf235e3106cd32ec32d5979144e941f818.tar.gz
fix: `.starter` tab completion (#709)
-rw-r--r--src/config/mod.rs32
-rw-r--r--src/repl/completer.rs17
2 files changed, 34 insertions, 15 deletions
diff --git a/src/config/mod.rs b/src/config/mod.rs
index 563ee55..8116532 100644
--- a/src/config/mod.rs
+++ b/src/config/mod.rs
@@ -1149,9 +1149,16 @@ impl Config {
.or_else(|| env::var("VISUAL").ok().or_else(|| env::var("EDITOR").ok()))
}
- pub fn repl_complete(&self, cmd: &str, args: &[&str]) -> Vec<(String, Option<String>)> {
- let (values, filter) = if args.len() == 1 {
- let values = match cmd {
+ pub fn repl_complete(
+ &self,
+ cmd: &str,
+ args: &[&str],
+ line: &str,
+ ) -> Vec<(String, Option<String>)> {
+ let mut values: Vec<(String, Option<String>)> = vec![];
+ let mut filter = "";
+ if args.len() == 1 {
+ values = match cmd {
".role" => self
.roles
.iter()
@@ -1203,9 +1210,9 @@ impl Config {
.collect(),
_ => vec![],
};
- (values, args[0])
- } else if args.len() == 2 && cmd == ".set" {
- let values = match args[0] {
+ filter = args[0]
+ } else if cmd == ".set" && args.len() == 2 {
+ let candidates = match args[0] {
"max_output_tokens" => match self.model.max_output_tokens() {
Some(v) => vec![v.to_string()],
None => vec![],
@@ -1242,9 +1249,16 @@ impl Config {
"highlight" => complete_bool(self.highlight),
_ => vec![],
};
- (values.into_iter().map(|v| (v, None)).collect(), args[1])
- } else {
- return vec![];
+ values = candidates.into_iter().map(|v| (v, None)).collect();
+ filter = args[1];
+ } else if cmd == ".starter" && args.len() >= 2 {
+ if let Some(agent) = &self.agent {
+ values = agent
+ .conversation_staters()
+ .iter()
+ .filter_map(|v| v.strip_prefix(line).map(|x| (x.to_string(), None)))
+ .collect()
+ }
};
values
.into_iter()
diff --git a/src/repl/completer.rs b/src/repl/completer.rs
index 1d68792..7f325bd 100644
--- a/src/repl/completer.rs
+++ b/src/repl/completer.rs
@@ -48,13 +48,18 @@ impl Completer for ReplCompleter {
if parts_len > 1 {
let span = Span::new(parts[parts_len - 1].1, pos);
+ let args_line = &line[parts[1].1..];
let args: Vec<&str> = parts.iter().skip(1).map(|(v, _)| *v).collect();
- suggestions.extend(self.config.read().repl_complete(cmd, &args).iter().map(
- |(value, description)| {
- let description = description.as_deref().unwrap_or_default();
- create_suggestion(value, description, span)
- },
- ))
+ suggestions.extend(
+ self.config
+ .read()
+ .repl_complete(cmd, &args, args_line)
+ .iter()
+ .map(|(value, description)| {
+ let description = description.as_deref().unwrap_or_default();
+ create_suggestion(value, description, span)
+ }),
+ )
}
if suggestions.is_empty() {