diff --git a/Cargo.lock b/Cargo.lock index ada9e0c5..8a82366a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -240,6 +240,16 @@ dependencies = [ "clap", ] +[[package]] +name = "clap_complete_nushell" +version = "4.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "315902e790cc6e5ddd20cbd313c1d0d49db77f191e149f96397230fb82a17677" +dependencies = [ + "clap", + "clap_complete", +] + [[package]] name = "clap_derive" version = "4.5.18" @@ -1708,6 +1718,7 @@ dependencies = [ "bstr", "clap", "clap_complete", + "clap_complete_nushell", "ctor", "ctrlc", "dialoguer", diff --git a/Cargo.toml b/Cargo.toml index 5ceb1aef..d7a04800 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -105,6 +105,7 @@ clap = { version = "4.5.21", features = [ "unstable-styles", ] } clap_complete = "4.5.38" +clap_complete_nushell = "4.5.4" ctor = "0.2.9" ctrlc = { version = "3.4.5", features = ["termination"] } dialoguer = { version = "0.11.0", features = ["fuzzy-select"] } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index c6dfa9e8..31b23a27 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -33,6 +33,7 @@ anyhow.workspace = true bstr.workspace = true clap.workspace = true clap_complete.workspace = true +clap_complete_nushell.workspace = true ctor.workspace = true ctrlc.workspace = true dialoguer.workspace = true diff --git a/cli/src/main.rs b/cli/src/main.rs index ae24f3fa..ca783b3e 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -7,7 +7,7 @@ use std::{ use anstyle::{AnsiColor, Color, Style}; use anyhow::{anyhow, Context, Result}; use clap::{crate_authors, Args, Command, FromArgMatches as _, Subcommand, ValueEnum}; -use clap_complete::{generate, Shell}; +use clap_complete::generate; use dialoguer::{theme::ColorfulTheme, Confirm, FuzzySelect, Input}; use glob::glob; use heck::ToUpperCamelCase; @@ -449,6 +449,16 @@ struct Complete { pub shell: Shell, } +#[derive(ValueEnum, Clone)] +pub enum Shell { + Bash, + Elvish, + Fish, + PowerShell, + Zsh, + Nushell, +} + impl InitConfig { fn run() -> Result<()> { if let Ok(Some(config_path)) = Config::find_config_file() { @@ -1293,12 +1303,19 @@ impl DumpLanguages { impl Complete { fn run(self, cli: &mut Command) { - generate( - self.shell, - cli, - cli.get_name().to_string(), - &mut std::io::stdout(), - ); + let name = cli.get_name().to_string(); + let mut stdout = std::io::stdout(); + + match self.shell { + Shell::Bash => generate(clap_complete::shells::Bash, cli, &name, &mut stdout), + Shell::Elvish => generate(clap_complete::shells::Elvish, cli, &name, &mut stdout), + Shell::Fish => generate(clap_complete::shells::Fish, cli, &name, &mut stdout), + Shell::PowerShell => { + generate(clap_complete::shells::PowerShell, cli, &name, &mut stdout); + } + Shell::Zsh => generate(clap_complete::shells::Zsh, cli, &name, &mut stdout), + Shell::Nushell => generate(clap_complete_nushell::Nushell, cli, &name, &mut stdout), + } } }