#shell-completion #completion #clap #reduce-boilerplate

clap_complete_command

简化为 Clap 添加 shell 完成命令的样板代码

14 个版本

0.6.1 2024 年 7 月 14 日
0.6.0 2024 年 7 月 14 日
0.5.1 2023 年 3 月 10 日
0.4.0 2022 年 10 月 4 日
0.1.0 2022 年 4 月 5 日

#43命令行界面

Download history 12152/week @ 2024-04-28 14384/week @ 2024-05-05 14188/week @ 2024-05-12 14661/week @ 2024-05-19 13817/week @ 2024-05-26 15277/week @ 2024-06-02 14615/week @ 2024-06-09 14013/week @ 2024-06-16 17919/week @ 2024-06-23 13801/week @ 2024-06-30 14581/week @ 2024-07-07 17075/week @ 2024-07-14 20586/week @ 2024-07-21 20044/week @ 2024-07-28 20517/week @ 2024-08-04 17653/week @ 2024-08-11

80,065 每月下载量
用于 22 个

MIT 许可证

17KB
199 代码行

clap-complete-command

crates.io

简化为 Clap 添加 shell 完成命令的样板代码

兼容的 clap 版本

clap 版本 clap_complete_command 版本
v3 v0.1, v0.2, v0.3
v4 v0.4, v0.5, v0.6

示例

派生

use clap::{CommandFactory, Parser, Subcommand};

#[derive(Parser)]
struct Cli {
    #[command(subcommand)]
    command: Commands,
}

#[derive(Subcommand)]
enum Commands {
    /// Generate shell completions
    Completions {
        /// The shell to generate the completions for
        #[arg(value_enum)]
        shell: clap_complete_command::Shell,
    },
}

fn main() {
    let cli = Cli::parse();

    match cli.command {
        // e.g. `$ cli completions bash`
        Commands::Completions { shell } => {
            shell.generate(&mut Cli::command(), &mut std::io::stdout());
        }
    }
}

构建器

use clap::{Arg, Command};

fn build_cli() -> Command {
    Command::new(env!("CARGO_PKG_NAME"))
        .subcommand_required(true)
        .subcommand(
            Command::new("completions")
                .about("Generate shell completions")
                .arg(
                    Arg::new("shell")
                        .value_name("SHELL")
                        .help("The shell to generate the completions for")
                        .required(true)
                        .value_parser(
                            clap::builder::EnumValueParser::<clap_complete_command::Shell>::new(),
                        ),
                ),
        )
}

fn main() {
    let matches = build_cli().get_matches();

    match matches.subcommand() {
        Some(("completions", sub_matches)) => {
            // e.g. `$ cli completions bash`
            if let Some(shell) = sub_matches.get_one::<clap_complete_command::Shell>("shell") {
                let mut command = build_cli();
                shell.generate(&mut command, &mut std::io::stdout());
            }
        }
        _ => {
            unreachable!("Exhausted list of subcommands and `subcommand_required` prevents `None`")
        }
    }
}

支持的 shell

支持的 shell 可在 clap_complete_command::Shell 中查看。

依赖项

~1–1.6MB
~27K SLoC