From dbe25ba5e6d8a73a784530757cfb137beb22825a Mon Sep 17 00:00:00 2001 From: einfachIrgendwer0815 <85333734+einfachIrgendwer0815@users.noreply.github.com> Date: Fri, 15 Nov 2024 19:43:39 +0100 Subject: [PATCH 1/3] Include shell completions in the executable --- build/application.rs | 17 +++++++++++++++++ doc/long-help.txt | 3 +++ doc/short-help.txt | 2 ++ src/bin/bat/clap_app.rs | 11 +++++++++++ src/bin/bat/completions.rs | 6 ++++++ src/bin/bat/main.rs | 14 ++++++++++++++ 6 files changed, 53 insertions(+) create mode 100644 src/bin/bat/completions.rs 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, From 04c7d1508437aeb43e25c6adb2f5253c2dd9c176 Mon Sep 17 00:00:00 2001 From: einfachIrgendwer0815 <85333734+einfachIrgendwer0815@users.noreply.github.com> Date: Fri, 15 Nov 2024 19:48:41 +0100 Subject: [PATCH 2/3] Mention --completion in the README --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index c09d0e36..cbe9d886 100644 --- a/README.md +++ b/README.md @@ -465,6 +465,12 @@ cargo install --locked bat Note that additional files like the man page or shell completion files can not be installed in this way. They will be generated by `cargo` and should be available in the cargo target folder (under `build`). +Shell completions are also available by running: +```bash +bat --completion +# see --help for supported shells +``` + ## Customization ### Highlighting theme From 7eff8b687cce603dc04cb199501d41bd5d4d30ad Mon Sep 17 00:00:00 2001 From: einfachIrgendwer0815 <85333734+einfachIrgendwer0815@users.noreply.github.com> Date: Sat, 16 Nov 2024 13:05:35 +0100 Subject: [PATCH 3/3] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0934f8a..4941340e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Add or remove individual style components without replacing all styles #2929 (@eth-p) - Automatically choose theme based on the terminal's color scheme, see #2896 (@bash) - Add option `--binary=as-text` for printing binary content, see issue #2974 and PR #2976 (@einfachIrgendwer0815) +- Make shell completions available via `--completion `, see issue #2057 and PR #3126 (@einfachIrgendwer0815) ## Bugfixes