Merge pull request #3126 from einfachIrgendwer0815/feature/included_completions

Add `--completion <SHELL>` to provide shell completions
This commit is contained in:
Keith Hall 2024-12-01 19:16:05 +02:00 committed by GitHub
commit 0cde7167d6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 60 additions and 0 deletions

View File

@ -11,6 +11,7 @@
- Add or remove individual style components without replacing all styles #2929 (@eth-p) - 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) - 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) - Add option `--binary=as-text` for printing binary content, see issue #2974 and PR #2976 (@einfachIrgendwer0815)
- Make shell completions available via `--completion <shell>`, see issue #2057 and PR #3126 (@einfachIrgendwer0815)
## Bugfixes ## Bugfixes

View File

@ -465,6 +465,12 @@ cargo install --locked bat
Note that additional files like the man page or shell completion 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`). 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 <shell>
# see --help for supported shells
```
## Customization ## Customization
### Highlighting theme ### Highlighting theme

View File

@ -63,5 +63,22 @@ pub fn gen_man_and_comp() -> anyhow::Result<()> {
out_dir.join("assets/completions/bat.zsh"), 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(()) Ok(())
} }

View File

@ -202,6 +202,9 @@ Options:
This option exists for POSIX-compliance reasons ('u' is for 'unbuffered'). The output is This option exists for POSIX-compliance reasons ('u' is for 'unbuffered'). The output is
always unbuffered - this option is simply ignored. always unbuffered - this option is simply ignored.
--completion <SHELL>
Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1]
--diagnostic --diagnostic
Show diagnostic information for bug reports. Show diagnostic information for bug reports.

View File

@ -58,6 +58,8 @@ Options:
Only print the lines from N to M. Only print the lines from N to M.
-L, --list-languages -L, --list-languages
Display all supported languages. Display all supported languages.
--completion <SHELL>
Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1]
-h, --help -h, --help
Print help (see more with '--help') Print help (see more with '--help')
-V, --version -V, --version

View File

@ -564,6 +564,17 @@ pub fn build_app(interactive_output: bool) -> Command {
.help("Do not load custom assets"), .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")] #[cfg(feature = "lessopen")]
{ {
app = app app = app

View File

@ -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"));

View File

@ -3,6 +3,8 @@
mod app; mod app;
mod assets; mod assets;
mod clap_app; mod clap_app;
#[cfg(feature = "application")]
mod completions;
mod config; mod config;
mod directories; mod directories;
mod input; mod input;
@ -347,6 +349,18 @@ fn run() -> Result<bool> {
return Ok(true); return Ok(true);
} }
#[cfg(feature = "application")]
if let Some(shell) = app.matches.get_one::<String>("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() { match app.matches.subcommand() {
Some(("cache", cache_matches)) => { Some(("cache", cache_matches)) => {
// If there is a file named 'cache' in the current working directory, // If there is a file named 'cache' in the current working directory,