diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 8784435..7298ce2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -116,7 +116,7 @@ jobs: PKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/package" ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/" mkdir -p "${ARCHIVE_DIR}" - mkdir -p "${ARCHIVE_DIR}/autocomplete" + mkdir -p "${ARCHIVE_DIR}/completions" # Binary cp "${{ steps.strip.outputs.BIN_PATH }}" "$ARCHIVE_DIR" @@ -124,6 +124,11 @@ jobs: # README, LICENSE and CHANGELOG files cp "README.md" "LICENSE" "$ARCHIVE_DIR" + # Shell completions + for sh in 'bash' 'fish' 'zsh'; do + "${{ steps.strip.outputs.BIN_PATH }}" gen-completions -s $sh -o "${ARCHIVE_DIR}/completions" + done + # base compressed package pushd "${PKG_STAGING}/" >/dev/null case ${{ matrix.job.target }} in diff --git a/README.md b/README.md index 7abb664..5f3fe33 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ I wanted to. And I **really** don't want to. - [History stats](docs/stats.md) - [Running your own server](docs/server.md) - [Key binding](docs/key-binding.md) +- [Shell completions](docs/shell-completions.md) ## Supported Shells diff --git a/docs/shell-completions.md b/docs/shell-completions.md new file mode 100644 index 0000000..4adf82b --- /dev/null +++ b/docs/shell-completions.md @@ -0,0 +1,19 @@ +# `atuin gen-completions` + +[Shell completions](https://en.wikipedia.org/wiki/Command-line_completion) for Atuin can be generated by specifying the output directory and desired shell via `gen-completions` subcommand. + +``` +$ atuin gen-completions --shell bash --out-dir $HOME + +Shell completion for BASH is generated in "/home/user" +``` + +Possible values for the `--shell` argument are the following: + +- `bash` +- `fish` +- `zsh` +- `powershell` +- `elvish` + +Also, see the [supported shells](./../README.md#supported-shells). diff --git a/src/command/mod.rs b/src/command/mod.rs index dc1f01f..d82ad13 100644 --- a/src/command/mod.rs +++ b/src/command/mod.rs @@ -1,6 +1,7 @@ use std::path::PathBuf; use eyre::{Result, WrapErr}; +use structopt::clap::Shell; use structopt::StructOpt; use atuin_client::database::Sqlite; @@ -92,6 +93,15 @@ pub enum AtuinCmd { #[structopt(about = "print the encryption key for transfer to another machine")] Key, + + #[structopt(about = "generate shell completions")] + GenCompletions { + #[structopt(long, short, help = "set the shell for generating completions")] + shell: Shell, + + #[structopt(long, short, help = "set the output directory")] + out_dir: String, + }, } impl AtuinCmd { @@ -157,11 +167,18 @@ impl AtuinCmd { println!("{}", encode); Ok(()) } - Self::Uuid => { println!("{}", uuid_v4()); Ok(()) } + Self::GenCompletions { shell, out_dir } => { + AtuinCmd::clap().gen_completions(env!("CARGO_PKG_NAME"), shell, &out_dir); + println!( + "Shell completion for {} is generated in {:?}", + shell, out_dir + ); + Ok(()) + } } } }