Support generating shell completions (#235)

* Add gen-completions subcommand for generating shell completions

* Update documentation about generating shell completions

* Include the shell completions in release tarball
This commit is contained in:
Orhun Parmaksız 2021-12-11 02:59:39 +03:00 committed by GitHub
parent 28f78ba4e1
commit 0abd063e01
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 2 deletions

View file

@ -116,7 +116,7 @@ jobs:
PKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/package" PKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/package"
ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/" ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/"
mkdir -p "${ARCHIVE_DIR}" mkdir -p "${ARCHIVE_DIR}"
mkdir -p "${ARCHIVE_DIR}/autocomplete" mkdir -p "${ARCHIVE_DIR}/completions"
# Binary # Binary
cp "${{ steps.strip.outputs.BIN_PATH }}" "$ARCHIVE_DIR" cp "${{ steps.strip.outputs.BIN_PATH }}" "$ARCHIVE_DIR"
@ -124,6 +124,11 @@ jobs:
# README, LICENSE and CHANGELOG files # README, LICENSE and CHANGELOG files
cp "README.md" "LICENSE" "$ARCHIVE_DIR" 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 # base compressed package
pushd "${PKG_STAGING}/" >/dev/null pushd "${PKG_STAGING}/" >/dev/null
case ${{ matrix.job.target }} in case ${{ matrix.job.target }} in

View file

@ -59,6 +59,7 @@ I wanted to. And I **really** don't want to.
- [History stats](docs/stats.md) - [History stats](docs/stats.md)
- [Running your own server](docs/server.md) - [Running your own server](docs/server.md)
- [Key binding](docs/key-binding.md) - [Key binding](docs/key-binding.md)
- [Shell completions](docs/shell-completions.md)
## Supported Shells ## Supported Shells

19
docs/shell-completions.md Normal file
View file

@ -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).

View file

@ -1,6 +1,7 @@
use std::path::PathBuf; use std::path::PathBuf;
use eyre::{Result, WrapErr}; use eyre::{Result, WrapErr};
use structopt::clap::Shell;
use structopt::StructOpt; use structopt::StructOpt;
use atuin_client::database::Sqlite; use atuin_client::database::Sqlite;
@ -92,6 +93,15 @@ pub enum AtuinCmd {
#[structopt(about = "print the encryption key for transfer to another machine")] #[structopt(about = "print the encryption key for transfer to another machine")]
Key, 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 { impl AtuinCmd {
@ -157,11 +167,18 @@ impl AtuinCmd {
println!("{}", encode); println!("{}", encode);
Ok(()) Ok(())
} }
Self::Uuid => { Self::Uuid => {
println!("{}", uuid_v4()); println!("{}", uuid_v4());
Ok(()) 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(())
}
} }
} }
} }