diff --git a/build/application.rs b/build/application.rs index 459aa5b1..addbae0e 100644 --- a/build/application.rs +++ b/build/application.rs @@ -63,5 +63,22 @@ pub fn gen_man_and_comp() -> anyhow::Result<()> { out_dir.join("assets/completions/bat.zsh"), )?; + println!( + "cargo:rustc-env=BAT_GENERATED_COMPLETION_BASH={}", + out_dir.join("assets/completions/bat.bash").display() + ); + println!( + "cargo:rustc-env=BAT_GENERATED_COMPLETION_FISH={}", + out_dir.join("assets/completions/bat.fish").display() + ); + println!( + "cargo:rustc-env=BAT_GENERATED_COMPLETION_PS1={}", + out_dir.join("assets/completions/_bat.ps1").display() + ); + println!( + "cargo:rustc-env=BAT_GENERATED_COMPLETION_ZSH={}", + out_dir.join("assets/completions/bat.zsh").display() + ); + Ok(()) } diff --git a/doc/long-help.txt b/doc/long-help.txt index 85d595b9..17d3395b 100644 --- a/doc/long-help.txt +++ b/doc/long-help.txt @@ -202,6 +202,9 @@ Options: This option exists for POSIX-compliance reasons ('u' is for 'unbuffered'). The output is always unbuffered - this option is simply ignored. + --completion + Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1] + --diagnostic Show diagnostic information for bug reports. diff --git a/doc/short-help.txt b/doc/short-help.txt index ba06ef30..d67a51d0 100644 --- a/doc/short-help.txt +++ b/doc/short-help.txt @@ -58,6 +58,8 @@ Options: Only print the lines from N to M. -L, --list-languages Display all supported languages. + --completion + Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1] -h, --help Print help (see more with '--help') -V, --version diff --git a/src/bin/bat/clap_app.rs b/src/bin/bat/clap_app.rs index f5e3948e..de2db078 100644 --- a/src/bin/bat/clap_app.rs +++ b/src/bin/bat/clap_app.rs @@ -564,6 +564,17 @@ pub fn build_app(interactive_output: bool) -> Command { .help("Do not load custom assets"), ); + #[cfg(feature = "application")] + { + app = app.arg( + Arg::new("completion") + .long("completion") + .value_name("SHELL") + .value_parser(["bash", "fish", "ps1", "zsh"]) + .help("Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1]"), + ); + } + #[cfg(feature = "lessopen")] { app = app diff --git a/src/bin/bat/completions.rs b/src/bin/bat/completions.rs new file mode 100644 index 00000000..9b63a3e9 --- /dev/null +++ b/src/bin/bat/completions.rs @@ -0,0 +1,6 @@ +use std::env; + +pub const BASH_COMPLETION: &str = include_str!(env!("BAT_GENERATED_COMPLETION_BASH")); +pub const FISH_COMPLETION: &str = include_str!(env!("BAT_GENERATED_COMPLETION_FISH")); +pub const PS1_COMPLETION: &str = include_str!(env!("BAT_GENERATED_COMPLETION_PS1")); +pub const ZSH_COMPLETION: &str = include_str!(env!("BAT_GENERATED_COMPLETION_ZSH")); diff --git a/src/bin/bat/main.rs b/src/bin/bat/main.rs index 7b7bafe6..253c3885 100644 --- a/src/bin/bat/main.rs +++ b/src/bin/bat/main.rs @@ -3,6 +3,8 @@ mod app; mod assets; mod clap_app; +#[cfg(feature = "application")] +mod completions; mod config; mod directories; mod input; @@ -347,6 +349,18 @@ fn run() -> Result { return Ok(true); } + #[cfg(feature = "application")] + if let Some(shell) = app.matches.get_one::("completion") { + match shell.as_str() { + "bash" => println!("{}", completions::BASH_COMPLETION), + "fish" => println!("{}", completions::FISH_COMPLETION), + "ps1" => println!("{}", completions::PS1_COMPLETION), + "zsh" => println!("{}", completions::ZSH_COMPLETION), + _ => unreachable!("No completion for shell '{}' available.", shell), + } + return Ok(true); + } + match app.matches.subcommand() { Some(("cache", cache_matches)) => { // If there is a file named 'cache' in the current working directory,