Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

wormhole-rs completion not working ?



Hi all,
I have an issue with a completion file not working correctly.
I'm the maintainer of wormhole-rs [0] in Debian, which is written in Rust and uses clap-complete (a rust library) during the build to generate the completion files. They work for bash and fish OOTB as expected. However, in zsh they don't and I want to know why. If I type "wormhole-rs" and then hit TAB only filenames get completed. However, if I manually source the completion file (located under /usr/share/zsh/vendor-completions) and then type the same completion works as expected.
My .zshrc: [1]

Attached the generated completion file.
Is there something wrong with the generated file ? I suspect so, but would like to get some expertise.

best,

werdahias

Links:

[0]: https://tracker.debian.org/pkg/rust-magic-wormhole-cli
[1]: https://codeberg.org/werdahias/graffe/src/branch/main/.zshrc
compdef _wormhole-rs wormhole-rs
 _wormhole-rs() { #compdef wormhole-rs

autoload -U is-at-least

_wormhole-rs() {
    typeset -A opt_args
    typeset -a _arguments_options
    local ret=1

    if is-at-least 5.2; then
        _arguments_options=(-s -S -C)
    else
        _arguments_options=(-s -C)
    fi

    local context curcontext="$curcontext" state line
    _arguments "${_arguments_options[@]}" : \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
":: :_wormhole-rs_commands" \
"*::: :->wormhole-rs" \
&& ret=0
    case $state in
    (wormhole-rs)
        words=($line[1] "${words[@]}")
        (( CURRENT += 1 ))
        curcontext="${curcontext%:*:*}:wormhole-rs-command-$line[1]:"
        case $line[1] in
            (send)
_arguments "${_arguments_options[@]}" : \
'*--relay-server=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'*--relay=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'--rendezvous-server=[Use a custom rendezvous server. Both sides need to use the same value in order to find each other]:ws://example.org:_urls' \
'--code=[Enter a code instead of generating one automatically]:CODE:_default' \
'-c+[Length of code (in bytes/words)]:NUMWORDS:_default' \
'--code-length=[Length of code (in bytes/words)]:NUMWORDS:_default' \
'--rename=[Suggest a different name to the receiver to keep the file'\''s actual name secret. Not allowed when sending more than one file]:FILE_NAME:_default' \
'--name=[Suggest a different name to the receiver to keep the file'\''s actual name secret. Not allowed when sending more than one file]:FILE_NAME:_default' \
'--force-direct[Disable the relay server support and force a direct connection]' \
'(--force-direct)--force-relay[Always route traffic over a relay server. This hides your IP address from the peer (but not from the server operators. Use Tor for that)]' \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
'*::files:_files' \
&& ret=0
;;
(tx)
_arguments "${_arguments_options[@]}" : \
'*--relay-server=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'*--relay=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'--rendezvous-server=[Use a custom rendezvous server. Both sides need to use the same value in order to find each other]:ws://example.org:_urls' \
'--code=[Enter a code instead of generating one automatically]:CODE:_default' \
'-c+[Length of code (in bytes/words)]:NUMWORDS:_default' \
'--code-length=[Length of code (in bytes/words)]:NUMWORDS:_default' \
'--rename=[Suggest a different name to the receiver to keep the file'\''s actual name secret. Not allowed when sending more than one file]:FILE_NAME:_default' \
'--name=[Suggest a different name to the receiver to keep the file'\''s actual name secret. Not allowed when sending more than one file]:FILE_NAME:_default' \
'--force-direct[Disable the relay server support and force a direct connection]' \
'(--force-direct)--force-relay[Always route traffic over a relay server. This hides your IP address from the peer (but not from the server operators. Use Tor for that)]' \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
'*::files:_files' \
&& ret=0
;;
(receive)
_arguments "${_arguments_options[@]}" : \
'*--relay-server=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'*--relay=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'--rendezvous-server=[Use a custom rendezvous server. Both sides need to use the same value in order to find each other]:ws://example.org:_urls' \
'--out-dir=[Store transferred file or folder in the specified directory. Defaults to \$PWD]:PATH:_files -/' \
'--noconfirm[Accept file transfer without asking for confirmation]' \
'--yes[Accept file transfer without asking for confirmation]' \
'--force-direct[Disable the relay server support and force a direct connection]' \
'(--force-direct)--force-relay[Always route traffic over a relay server. This hides your IP address from the peer (but not from the server operators. Use Tor for that)]' \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
'::code -- Provide the code now rather than typing it interactively:_default' \
&& ret=0
;;
(rx)
_arguments "${_arguments_options[@]}" : \
'*--relay-server=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'*--relay=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'--rendezvous-server=[Use a custom rendezvous server. Both sides need to use the same value in order to find each other]:ws://example.org:_urls' \
'--out-dir=[Store transferred file or folder in the specified directory. Defaults to \$PWD]:PATH:_files -/' \
'--noconfirm[Accept file transfer without asking for confirmation]' \
'--yes[Accept file transfer without asking for confirmation]' \
'--force-direct[Disable the relay server support and force a direct connection]' \
'(--force-direct)--force-relay[Always route traffic over a relay server. This hides your IP address from the peer (but not from the server operators. Use Tor for that)]' \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
'::code -- Provide the code now rather than typing it interactively:_default' \
&& ret=0
;;
(send-many)
_arguments "${_arguments_options[@]}" : \
'-n+[Only send the file up to n times, limiting the number of people that may receive it. These are also the number of tries a potential attacker gets at guessing the password]:N:_default' \
'--tries=[Only send the file up to n times, limiting the number of people that may receive it. These are also the number of tries a potential attacker gets at guessing the password]:N:_default' \
'--timeout=[Automatically stop providing the file after a certain amount of time]:MINUTES:_default' \
'*--relay-server=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'*--relay=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'--rendezvous-server=[Use a custom rendezvous server. Both sides need to use the same value in order to find each other]:ws://example.org:_urls' \
'--code=[Enter a code instead of generating one automatically]:CODE:_default' \
'-c+[Length of code (in bytes/words)]:NUMWORDS:_default' \
'--code-length=[Length of code (in bytes/words)]:NUMWORDS:_default' \
'--rename=[Suggest a different name to the receiver to keep the file'\''s actual name secret. Not allowed when sending more than one file]:FILE_NAME:_default' \
'--name=[Suggest a different name to the receiver to keep the file'\''s actual name secret. Not allowed when sending more than one file]:FILE_NAME:_default' \
'--force-direct[Disable the relay server support and force a direct connection]' \
'(--force-direct)--force-relay[Always route traffic over a relay server. This hides your IP address from the peer (but not from the server operators. Use Tor for that)]' \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
'*::files:_files' \
&& ret=0
;;
(forward)
_arguments "${_arguments_options[@]}" : \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
":: :_wormhole-rs__forward_commands" \
"*::: :->forward" \
&& ret=0

    case $state in
    (forward)
        words=($line[1] "${words[@]}")
        (( CURRENT += 1 ))
        curcontext="${curcontext%:*:*}:wormhole-rs-forward-command-$line[1]:"
        case $line[1] in
            (serve)
_arguments "${_arguments_options[@]}" : \
'*--relay-server=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'*--relay=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'--rendezvous-server=[Use a custom rendezvous server. Both sides need to use the same value in order to find each other]:ws://example.org:_urls' \
'--code=[Enter a code instead of generating one automatically]:CODE:_default' \
'-c+[Length of code (in bytes/words)]:NUMWORDS:_default' \
'--code-length=[Length of code (in bytes/words)]:NUMWORDS:_default' \
'--force-direct[Disable the relay server support and force a direct connection]' \
'(--force-direct)--force-relay[Always route traffic over a relay server. This hides your IP address from the peer (but not from the server operators. Use Tor for that)]' \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
'*::targets -- List of ports to open up. You can optionally specify a domain/address to forward remote ports:_hosts' \
&& ret=0
;;
(open)
_arguments "${_arguments_options[@]}" : \
'*--relay-server=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'*--relay=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'--rendezvous-server=[Use a custom rendezvous server. Both sides need to use the same value in order to find each other]:ws://example.org:_urls' \
'--code=[Enter a code instead of generating one automatically]:CODE:_default' \
'-c+[Length of code (in bytes/words)]:NUMWORDS:_default' \
'--code-length=[Length of code (in bytes/words)]:NUMWORDS:_default' \
'--force-direct[Disable the relay server support and force a direct connection]' \
'(--force-direct)--force-relay[Always route traffic over a relay server. This hides your IP address from the peer (but not from the server operators. Use Tor for that)]' \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
'*::targets -- List of ports to open up. You can optionally specify a domain/address to forward remote ports:_hosts' \
&& ret=0
;;
(connect)
_arguments "${_arguments_options[@]}" : \
'*-p+[Bind to specific ports instead of taking random free high ports. Can be provided multiple times]:PORT:_default' \
'*--port=[Bind to specific ports instead of taking random free high ports. Can be provided multiple times]:PORT:_default' \
'--bind=[Bind to a specific address to accept the forwarding. Depending on your system and firewall, this may make the forwarded ports accessible from the outside]:ADDRESS:' \
'*--relay-server=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'*--relay=[Use a custom relay server (specify multiple times for multiple relays)]:tcp://HOSTNAME:PORT:_urls' \
'--rendezvous-server=[Use a custom rendezvous server. Both sides need to use the same value in order to find each other]:ws://example.org:_urls' \
'--noconfirm[Accept the forwarding without asking for confirmation]' \
'--yes[Accept the forwarding without asking for confirmation]' \
'--force-direct[Disable the relay server support and force a direct connection]' \
'(--force-direct)--force-relay[Always route traffic over a relay server. This hides your IP address from the peer (but not from the server operators. Use Tor for that)]' \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
'::code -- Provide the code now rather than typing it interactively:_default' \
&& ret=0
;;
        esac
    ;;
esac
;;
(completion)
_arguments "${_arguments_options[@]}" : \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
':shell -- The shell type to generate completions for (bash, elvish, powershell, zsh):(bash elvish fish powershell zsh)' \
&& ret=0
;;
(help)
_arguments "${_arguments_options[@]}" : \
'-v[Enable logging to stdout, for debugging purposes]' \
'--verbose[Enable logging to stdout, for debugging purposes]' \
'-h[Print help]' \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
&& ret=0
;;
        esac
    ;;
esac
}

(( $+functions[_wormhole-rs_commands] )) ||
_wormhole-rs_commands() {
    local commands; commands=(
'send:Send a file or a folder' \
'tx:Send a file or a folder' \
'receive:Receive a file or a folder' \
'rx:Receive a file or a folder' \
'send-many:Send a file to many recipients' \
'forward:Forward ports from one machine to another' \
'completion:Generate shell completions for the wormhole CLI' \
'help:' \
    )
    _describe -t commands 'wormhole-rs commands' commands "$@"
}
(( $+functions[_wormhole-rs__completion_commands] )) ||
_wormhole-rs__completion_commands() {
    local commands; commands=()
    _describe -t commands 'wormhole-rs completion commands' commands "$@"
}
(( $+functions[_wormhole-rs__forward_commands] )) ||
_wormhole-rs__forward_commands() {
    local commands; commands=(
'serve:Make the following ports of your system available to your peer' \
'open:Make the following ports of your system available to your peer' \
'connect:Connect to some ports forwarded to you' \
    )
    _describe -t commands 'wormhole-rs forward commands' commands "$@"
}
(( $+functions[_wormhole-rs__forward__connect_commands] )) ||
_wormhole-rs__forward__connect_commands() {
    local commands; commands=()
    _describe -t commands 'wormhole-rs forward connect commands' commands "$@"
}
(( $+functions[_wormhole-rs__forward__serve_commands] )) ||
_wormhole-rs__forward__serve_commands() {
    local commands; commands=()
    _describe -t commands 'wormhole-rs forward serve commands' commands "$@"
}
(( $+functions[_wormhole-rs__help_commands] )) ||
_wormhole-rs__help_commands() {
    local commands; commands=()
    _describe -t commands 'wormhole-rs help commands' commands "$@"
}
(( $+functions[_wormhole-rs__receive_commands] )) ||
_wormhole-rs__receive_commands() {
    local commands; commands=()
    _describe -t commands 'wormhole-rs receive commands' commands "$@"
}
(( $+functions[_wormhole-rs__send_commands] )) ||
_wormhole-rs__send_commands() {
    local commands; commands=()
    _describe -t commands 'wormhole-rs send commands' commands "$@"
}
(( $+functions[_wormhole-rs__send-many_commands] )) ||
_wormhole-rs__send-many_commands() {
    local commands; commands=()
    _describe -t commands 'wormhole-rs send-many commands' commands "$@"
}

if [ "$funcstack[1]" = "_wormhole-rs" ]; then
    _wormhole-rs "$@"
else
    compdef _wormhole-rs wormhole-rs
fi
 }

if [ "$funcstack[1]" = "wormhole-rs" ]; then
   wormhole-rs "$@"
fi


Messages sorted by: Reverse Date, Date, Thread, Author