summaryrefslogtreecommitdiff
path: root/src/cmds
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-03-26 15:55:10 +0800
committer魏曹先生 <1992414357@qq.com>2026-03-26 15:55:10 +0800
commitfb2ffa849a2cf9251cc274ebea5daa9898579787 (patch)
tree53b87ee60ba7c6ee7b001221855a6f3bff7e8526 /src/cmds
parent4cb7c2e91d7dbde32de31e6ab48683d60212ec1d (diff)
Add shell completion system with descriptions and i18n support
Diffstat (limited to 'src/cmds')
-rw-r--r--src/cmds/comp/helpdoc.rs22
-rw-r--r--src/cmds/comp/sheetdump.rs16
-rw-r--r--src/cmds/comp/sheetedit.rs17
-rw-r--r--src/cmds/comp/version.rs17
-rw-r--r--src/cmds/comp/workspace_alias.rs24
-rw-r--r--src/cmds/comp/workspace_sheet.rs46
6 files changed, 91 insertions, 51 deletions
diff --git a/src/cmds/comp/helpdoc.rs b/src/cmds/comp/helpdoc.rs
index 7f07cad..423e2bf 100644
--- a/src/cmds/comp/helpdoc.rs
+++ b/src/cmds/comp/helpdoc.rs
@@ -1,13 +1,17 @@
-use crate::systems::{comp::context::CompletionContext, helpdoc};
+use comp_system_macros::file_suggest;
-pub fn comp(ctx: CompletionContext) -> Option<Vec<String>> {
+use crate::systems::{
+ comp::{context::CompletionContext, result::CompletionResult},
+ helpdoc,
+};
+
+pub fn comp(ctx: CompletionContext) -> CompletionResult {
if ctx.previous_word == "helpdoc" {
- return Some(
- helpdoc::get_helpdoc_list()
- .iter()
- .map(|s| s.to_string())
- .collect(),
- );
+ return helpdoc::get_helpdoc_list()
+ .iter()
+ .map(|s| s.to_string())
+ .collect::<Vec<String>>()
+ .into();
}
- None
+ file_suggest!()
}
diff --git a/src/cmds/comp/sheetdump.rs b/src/cmds/comp/sheetdump.rs
index 3528cf3..e3105c0 100644
--- a/src/cmds/comp/sheetdump.rs
+++ b/src/cmds/comp/sheetdump.rs
@@ -1,11 +1,15 @@
-use cli_utils::string_vec;
+use comp_system_macros::{file_suggest, suggest};
+use rust_i18n::t;
-use crate::systems::comp::context::CompletionContext;
+use crate::systems::comp::{context::CompletionContext, result::CompletionResult};
-pub fn comp(ctx: CompletionContext) -> Option<Vec<String>> {
+pub fn comp(ctx: CompletionContext) -> CompletionResult {
if ctx.current_word.starts_with('-') {
- return Some(string_vec!["--no-sort", "--no-pretty"]);
+ return suggest!(
+ "--no-sort" = t!("sheetdump.comp.no_sort").trim(),
+ "--no-pretty" = t!("sheetdump.comp.no_pretty").trim()
+ )
+ .into();
}
-
- None
+ file_suggest!()
}
diff --git a/src/cmds/comp/sheetedit.rs b/src/cmds/comp/sheetedit.rs
index d210028..1ebf63d 100644
--- a/src/cmds/comp/sheetedit.rs
+++ b/src/cmds/comp/sheetedit.rs
@@ -1,15 +1,20 @@
-use cli_utils::string_vec;
+use comp_system_macros::{file_suggest, suggest};
+use rust_i18n::t;
-use crate::systems::comp::context::CompletionContext;
+use crate::systems::comp::{context::CompletionContext, result::CompletionResult};
-pub fn comp(ctx: CompletionContext) -> Option<Vec<String>> {
+pub fn comp(ctx: CompletionContext) -> CompletionResult {
if ctx.current_word.starts_with('-') {
- return Some(string_vec!["-e", "--editor"]);
+ return suggest!(
+ "-e" = t!("sheetedit.comp.editor").trim(),
+ "--editor" = t!("sheetedit.comp.editor").trim(),
+ )
+ .into();
}
if ctx.previous_word == "-e" || ctx.previous_word == "--editor" {
- return Some(vec![]);
+ return suggest!().into();
}
- None
+ file_suggest!()
}
diff --git a/src/cmds/comp/version.rs b/src/cmds/comp/version.rs
index 1460214..2c6b674 100644
--- a/src/cmds/comp/version.rs
+++ b/src/cmds/comp/version.rs
@@ -1,11 +1,16 @@
-use cli_utils::string_vec;
+use comp_system_macros::{file_suggest, suggest};
+use rust_i18n::t;
-use crate::systems::comp::context::CompletionContext;
+use crate::systems::comp::{context::CompletionContext, result::CompletionResult};
-pub fn comp(ctx: CompletionContext) -> Option<Vec<String>> {
+pub fn comp(ctx: CompletionContext) -> CompletionResult {
if ctx.current_word.starts_with('-') {
- return Some(string_vec!["-c", "--with-compile-info", "--no-banner"]);
+ return suggest!(
+ "-c" = t!("version.comp.with_compile_info").trim(),
+ "--with-compile-info" = t!("version.comp.with_compile_info").trim(),
+ "--no-banner" = t!("version.comp.no_banner").trim()
+ )
+ .into();
}
-
- None
+ file_suggest!()
}
diff --git a/src/cmds/comp/workspace_alias.rs b/src/cmds/comp/workspace_alias.rs
index a8ac495..cd39c9d 100644
--- a/src/cmds/comp/workspace_alias.rs
+++ b/src/cmds/comp/workspace_alias.rs
@@ -1,17 +1,25 @@
-use cli_utils::string_vec;
+use comp_system_macros::{file_suggest, suggest};
+use rust_i18n::t;
-use crate::systems::comp::context::CompletionContext;
+use crate::systems::comp::{context::CompletionContext, result::CompletionResult};
-pub fn comp(ctx: CompletionContext) -> Option<Vec<String>> {
+pub fn comp(ctx: CompletionContext) -> CompletionResult {
if ctx.current_word.starts_with('-') {
- return Some(string_vec![
- "-i", "--insert", "-Q", "--query", "-e", "--erase", "--to",
- ]);
+ return suggest!(
+ "-i" = t!("workspace_alias.comp.insert").trim(),
+ "--insert" = t!("workspace_alias.comp.insert").trim(),
+ "-Q" = t!("workspace_alias.comp.query").trim(),
+ "--query" = t!("workspace_alias.comp.query").trim(),
+ "-e" = t!("workspace_alias.comp.erase").trim(),
+ "--erase" = t!("workspace_alias.comp.erase").trim(),
+ "--to" = t!("workspace_alias.comp.to").trim()
+ )
+ .into();
}
if ctx.previous_word == "--to" {
- return Some(vec![]);
+ return suggest!().into();
}
- None
+ file_suggest!()
}
diff --git a/src/cmds/comp/workspace_sheet.rs b/src/cmds/comp/workspace_sheet.rs
index 3162442..8318fbe 100644
--- a/src/cmds/comp/workspace_sheet.rs
+++ b/src/cmds/comp/workspace_sheet.rs
@@ -1,25 +1,39 @@
-use crate::systems::comp::context::CompletionContext;
-use cli_utils::string_vec;
+use comp_system_macros::{file_suggest, suggest};
use just_enough_vcs::system::workspace::workspace::manager::WorkspaceManager;
+use rust_i18n::t;
-pub fn comp(ctx: CompletionContext) -> Option<Vec<String>> {
+use crate::systems::comp::{context::CompletionContext, result::CompletionResult};
+
+pub fn comp(ctx: CompletionContext) -> CompletionResult {
if ctx.current_word.starts_with('-') {
- return Some(string_vec![
- "-A",
- "--list-all",
- "-p",
- "--print-path",
- "-n",
- "--new",
- "-d",
- "--delete",
- ]);
+ return suggest!(
+ "-A" = t!("workspace_sheet.comp.list_all").trim(),
+ "--list-all" = t!("workspace_sheet.comp.list_all").trim(),
+ "-p" = t!("workspace_sheet.comp.print_path").trim(),
+ "--print-path" = t!("workspace.sheet.comp.print_path").trim(),
+ "-n" = t!("workspace_sheet.comp.new").trim(),
+ "--new" = t!("workspace_sheet.comp.new").trim(),
+ "-d" = t!("workspace_sheet.comp.delete").trim(),
+ "--delete" = t!("workspace_sheet.comp.delete").trim()
+ )
+ .into();
}
if ctx.previous_word == "--new" || ctx.previous_word == "-n" {
- return Some(vec![]);
+ return suggest!().into();
+ }
+
+ if ctx.previous_word == "--list-all"
+ || ctx.previous_word == "-A"
+ || ctx.previous_word == "--print-path"
+ || ctx.previous_word == "-p"
+ || ctx.previous_word == "--delete"
+ || ctx.previous_word == "-d"
+ {
+ let rt = tokio::runtime::Runtime::new().unwrap();
+ let names = rt.block_on(WorkspaceManager::new().list_sheet_names());
+ return names.into();
}
- let rt = tokio::runtime::Runtime::new().unwrap();
- Some(rt.block_on(WorkspaceManager::new().list_sheet_names()))
+ file_suggest!()
}