From 9466ff2a22a3c141af82835a41c89eac73ceb8b7 Mon Sep 17 00:00:00 2001 From: Mahmoud Al-Qudsi Date: Thu, 1 Sep 2022 13:52:54 -0500 Subject: [PATCH] Provide dynamic completions for `cargo {add,install}` `cargo search` can be used to quickly get crates matching a search string, so we can pass the current token for first-arg completions to `cargo add` and `cargo install` to `cargo search` to look up matches. `cargo search` doesn't restrict itself to (nor prioritize for) prefix matches, while fish will only display prefix matches (for dynamically generated completions) so it's perfectly possible for `cargo search foo` to return 20 results none of which will successfully result in a completion, but for a further-narrowed completion of `cargo install foob^I" to then result in completions because `cargo search` ended up returning a prefix match for `foob` while it didn't for `foo`. The only other oob cargo subcommand that takes a crate name (that isn't the name of a crate specified in `Cargo.toml`) is `cargo search` but there's no point in providing completions to that... I think (it's possible to search for crate "foo" in order to get its latest version number rather than its name, but I'm not sure that's worth supporting). --- share/completions/cargo.fish | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/share/completions/cargo.fish b/share/completions/cargo.fish index 6e6b338fe..a05d9f779 100644 --- a/share/completions/cargo.fish +++ b/share/completions/cargo.fish @@ -26,6 +26,28 @@ end complete -c cargo -n '__fish_seen_subcommand_from run test build debug check' -l package \ -xa "(__fish_cargo_packages)" +# Look up crates.io crates matching the the single argument provided to this function +function __fish_cargo_search + if test (string length "$argv[1]") -le 2 + # Don't waste time searching for strings with too many results to realistically + # provide a meaningful completion within our results limit. + return + end + + # This doesn't do a prefix search, so bump up the limit a tiny bit to try and + # get enough results to show something. + cargo search --color never --quiet --limit 20 $argv[1] | + # Filter out placeholders and "... and xxx more crates" + string match -rvi '^\.\.\.|= "0.0.0"|# .*(reserved|yanked)' | + # Remove the version number and map the description + string replace -rf '^([^ ]+).*# (.*)' '$1\t$2' +end + +# Complete possible crate names by search the crates.io index +complete -c cargo -n '__fish_seen_subcommand_from add install' -n '__fish_is_nth_token 2' \ + -a "(__fish_cargo_search (commandline -ct))" + + ## --- AUTO-GENERATED WITH `cargo complete fish` --- complete -c cargo -n __fish_use_subcommand -l explain -d 'Run `rustc --explain CODE`' complete -c cargo -n __fish_use_subcommand -l color -d 'Coloring: auto, always, never'