1
0
Fork 0
mirror of https://github.com/ohmyzsh/ohmyzsh.git synced 2024-11-27 16:20:07 +00:00
ohmyzsh/plugins/expressvpn/_expressvpn
deb0ch f56eb6de31 feat(expressvpn): add plugin for ExpressVPN
This fix makes the autocompletion script also work on zsh without
changing how it works for Bash.

The expression "${COMP_WORDS[@]:2:$COMP_CWORD-2}" does not behave the
same on Bash and Zsh when the command has only zero or one arguments,
e.g. typing "expressvpn conne<TAB>" or "expressvpn <TAB>" would print
the error "autocomplete:8: substring expression: 1 < 2". This fixes it
by handling the case of the short command separately in a simpler way
and handling the rest of the cases the same way as before.

With this fix, zsh users just have to use the command "source
/usr/share/bash-completion/completions/expressvpn" to get the same
auto-completion as bash users.

File : /usr/share/bash-completion/completions/expressvpn

Diff to the original file (using the `diff` command) :

9a10,12
>         opts=$( ${COMP_WORDS[0]} "$cmd" "${COMP_WORDS[@]:2:$COMP_CWORD-2}" --generate-bash-completion )
>     else
>         opts=$( ${COMP_WORDS[0]} --generate-bash-completion )
11d13
<     opts=$( ${COMP_WORDS[0]} "$cmd" "${COMP_WORDS[@]:2:$COMP_CWORD-2}" --generate-bash-completion )
2022-05-22 23:01:38 +02:00

49 lines
1.6 KiB
Bash

#compdef expressvpn
# bash completion for expressvpn -*- shell-script -*-
_expressvpn_bash_autocomplete() {
local cur cmd opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
if [ "$COMP_CWORD" -gt 1 ]; then
cmd="${COMP_WORDS[1]}"
opts=$( ${COMP_WORDS[0]} "$cmd" "${COMP_WORDS[@]:2:$COMP_CWORD-2}" --generate-bash-completion )
else
opts=$( ${COMP_WORDS[0]} --generate-bash-completion )
fi
local IFS=$'\n'
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
local escaped_single_qoute="\\'"
local i=0
for entry in ${COMPREPLY[*]}
do
if [[ "${cur:0:1}" == "'" ]]
then
# started with single quote, escaping only other single quotes
# [']bla'bla"bla\bla bla --> [']bla'\''bla"bla\bla bla
COMPREPLY[$i]="${entry//\'/${escaped_single_qoute}}"
elif [[ "${cur:0:1}" == "\"" ]]
then
# started with double quote, escaping all double quotes and all backslashes
# ["]bla'bla"bla\bla bla --> ["]bla'bla\"bla\\bla bla
entry="${entry//\\/\\\\}"
COMPREPLY[$i]="${entry//\"/\\\"}"
else
# no quotes in front, escaping _everything_
# [ ]bla'bla"bla\bla bla --> [ ]bla\'bla\"bla\\bla\ bla
entry="${entry//\\/\\\\}"
entry="${entry//\'/\'}"
entry="${entry//\"/\\\"}"
COMPREPLY[$i]="${entry// /\\ }"
fi
(( i++ ))
done
return 0
}
complete -F _expressvpn_bash_autocomplete expressvpn