Autocomplete on bash and fish
XenGi opened this issue · comments
Ahoi,
how could autocompletion be accomplished? It would nice if prx could generate the needed output for these shells. I don't know how pass does it, but I could just type pass <tab>
and get a list of entries. Would be nice to have the same feature with prs.
how could autocompletion be accomplished?
This is done through an autocomplete script. Yes, such a script can be generated from prs
's code through clap
.
I'm not sure whether it would provide autocomplete for entries itself by default, so it might need some patching. But autocompleting sub-commands definitely works.
I might implement this through a hidden sub-command to generate the scripts at runtime, in a similar way I've done in ffsend
.
I'm currently working on implementing this.
You'll be able to generate a shell completion script for your preferred shell from prs
:
# For example
prs internal completions --help
prs internal completions bash
prs internal completions fish --stdout | source
This is what I'm currently seeing in the fish
shell after pressing Tab:
It also appears to be somewhat of a mess in bash
at this moment:
It doesn't complete secret/password items/names now (but completes subcommands, arguments and flags), though it is a step in the right direction. Completing secrets is something I might implement later, as it is a bit more complex.
Related merge request: https://gitlab.com/timvisee/prs/-/merge_requests/19
The completions for ZSH don't work yet:
$ RUST_BACKTRACE=full prs internal completions zsh
Generating completions for zsh...thread 'main' panicked at 'Fatal internal error. Please consider filing a bug report at https://github.com/clap-rs/clap/issues', /build/prs-0.2.8-vendor.tar.gz/clap/src/completions/zsh.rs:407:29
stack backtrace:
0: 0x56471631913c - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::hc72b2a79902e20a2
1: 0x56471634455f - core::fmt::write::h363ea858f8d20109
2: 0x564716318516 - std::io::Write::write_fmt::hdcbf0bc3dc301e4b
3: 0x5647162fd4d5 - std::panicking::default_hook::{{closure}}::hf776c4b8a29e2c23
4: 0x5647162fd0a3 - std::panicking::default_hook::hd9a17e7e9b9c0d25
5: 0x5647162fdb05 - std::panicking::rust_panic_with_hook::hf65e38fdef13d248
6: 0x564716319957 - std::panicking::begin_panic_handler::{{closure}}::h469be7df0b5aefa3
7: 0x56471631929c - std::sys_common::backtrace::__rust_end_short_backtrace::hc9b4220705693734
8: 0x5647162fd6b2 - rust_begin_unwind
9: 0x564716344301 - core::panicking::panic_fmt::h0c4f421549c9e9f1
10: 0x56471634b303 - core::option::expect_failed::h9463ba78b917711c
11: 0x5647162efa0c - clap::completions::zsh::get_args_of::h86eff9d199e34388
12: 0x5647162ed1d3 - clap::completions::zsh::get_subcommands_of::h44c43202de2f1071
13: 0x5647162ec402 - clap::completions::zsh::ZshGen::generate_to::h99899a869746645e
14: 0x56471629ad1c - clap::app::parser::Parser::gen_completions::h1d499f2e85f41aee
15: 0x564715fd94c7 - prs::action::internal::Internal::invoke::hde9f01aff9c4de05
16: 0x564715fb448c - prs::main::h8647502fcd461a35
17: 0x564715fb79d3 - std::sys_common::backtrace::__rust_begin_short_backtrace::h9129a2b4b3244bf6
18: 0x564715fb79e9 - std::rt::lang_start::{{closure}}::h66a466acfee3db59
19: 0x5647162fdeba - std::rt::lang_start_internal::h085ffe6d399bf24c
20: 0x564715fb7872 - main
21: 0x7ff3b8284ded - __libc_start_main
22: 0x564715f920ca - _start
23: 0x0 - <unknown>
@dotlambda Thanks for the report. I can indeed reproduce this with:
prs internal completions zsh --stdout
@timvisee I manually edited edited the prs.bash
file to get
autocompletion for secrets too, by using prs list --list
Though I'm not sure how practical it would be to automatically replace
it for autogeneration, but I thought it would be good to communicate
how I solved it.
Example for prs show
Before:
prs__show)
opts=" -s -t -p -c -f -I -y -q -v -h --first --store --timeout --property --copy --force --no-interact --yes --quiet --verbose --gpg-tty --help <QUERY> "
if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
return 0
fi
After:
prs__show)
opts=" -s -t -p -c -f -I -y -q -v -h --first --store --timeout --property --copy --force --no-interact --yes --quiet --verbose --gpg-tty --help <QUERY> "
if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
if [[ ${COMPREPLY} == "" ]] ; then
COMPREPLY=( $(compgen -W "$(prs list --list)" -- "${cur}") )
fi
return 0
fi
An alternative way would be to String::replace()
in the autogenerated
code <QUERY>
with $(prs list --list)
, but that leads to a less nice
result as it makes it harder to use autocompletion to find options.
@titaniumtraveler Awesome work, thanks for this! I'd love to see a feature in clap
to generate this, though I don't think there is.
It may be worth to add the changed script to this repository, feel free to do so in a PR.
An alternative way would be to
String::replace()
in the autogenerated
code<QUERY>
with$(prs list --list)
, but that leads to a less nice
result as it makes it harder to use autocompletion to find options.
This sounds like the best approach we currently have.