Supplement
Shell-agnostic, extensible CLI completion for Rust 💊
supplement is a Rust library that generates completion scaffolds as Rust code.
Give it a clap object, and instead of spitting out shell files that you later have to manually edit, it spits out Rust! supplement is:
- Shell-agnostic
- Powerful - Some features are not widely supported in every shell, and
supplementcomes to the rescue. - Stop modifying generated files - Instead, extend it with Rust's enum system.
- Easy to test and debug - Functions and objects in a modern programming language, instead of some shell script black sorcery.
- It's Rust 🦀
Install
Add one line in Cargo.toml. By default, it uses clap 4, but you can make it use clap 3 with features.
[]
= "0.1"
# Or, to use clap 3
= { = "0.1", = false, = ["clap-3"] }
# Or, disable the code-gen feature completely
= { = "0.1", = false }
Quick start
Say you have this awesome clap definition, and want to use supplement to make it even more awesome.
use ;
// more definition...
You can now edit build.rs to generate the scaffold code (see supplement-example/build.rs), and in main.rs, utilize the generated code like this:
use *;
Note that, if you missed some implementation, it's a compile time error. So just relex and let Rust get your back 💪
And after implementing everything, compile it to binary file and create a shell completion file to tell the shell how to use the binary. For example, in fish shell you should have:
# Put this to /usr/share/fish/completions/git.fish or ~/.config/fish/completions/git.fish
function __do_completion
set cmd (commandline -j)
set cmd_arr (string split ' ' $cmd)
if [ -z "$cmd_arr[-1]" ]
# preserve the last white space
echo $cmd "''" | xargs path/to/your/binary
else
echo $cmd | xargs path/to/your/binary
end
end
complete -k -c git -x -a "(__do_completion)"
The scripts for all supported shells can be found in supplement-example/shell.
A complete example can be found in supplement-example.