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 some awesome clap definition, and want to use supplement to make it even more awesome.
// src/args.rs
use ;
// more definition...
You can call supplement::generate to generate the completion file (preferably in build.rs):
// path to the clap definition
use Git;
use CommandFactory;
use Path;
use generate;
Implementation
Utilize the generated code in main.rs.
Note that, if you missed some implementation, it's a compile time error.
So just relex and let Rust get your back 💪
use ;
Install to system
After implementing everything, compile it to binary file, and create a shell completion script to tell the shell how to use the binary. Here's an example for Fish shell:
# 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.