Skip to content

Commit

Permalink
completion: make bash completion work in zsh
Browse files Browse the repository at this point in the history
`compgen -W` does not behave the same way in zsh as it does in bash; it seems not to
actually generate the completions we want.

- [x] add a zsh equivalent and `_compgen_w` to abstract it away
- [x] use `_compgen_w` instead of `compgen -W`
  • Loading branch information
tgamblin committed Aug 30, 2023
1 parent 396f219 commit 6693dc5
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
18 changes: 16 additions & 2 deletions share/spack/bash/spack-completion.bash
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,20 @@ if test -n "${ZSH_VERSION:-}" ; then
fi
fi

# compgen -W doesn't work in some versions of zsh, so use this instead.
# see https://www.zsh.org/mla/workers/2011/msg00582.html
_compgen_w() {
if test -n "${ZSH_VERSION:-}" ; then
typeset -a words
words=( ${~=1} )
local find="$2"
results=(${(M)words[@]:#$find*})
echo "${results[@]}"
else
compgen -W "$1" -- "$2"
fi
}

# Bash programmable completion for Spack
_bash_completion_spack() {
# In all following examples, let the cursor be denoted by brackets, i.e. []
Expand Down Expand Up @@ -137,7 +151,7 @@ _bash_completion_spack() {
if [[ "$(LC_ALL=C type $subfunction 2>&1)" =~ $rgx ]]
then
$subfunction
COMPREPLY=($(compgen -W "$SPACK_COMPREPLY" -- "$cur"))
COMPREPLY=($(_compgen_w "$SPACK_COMPREPLY" "$cur"))
fi

# if every completion is an alias for the same thing, just return that thing.
Expand Down Expand Up @@ -359,7 +373,7 @@ _spack_compress_aliases() {
fi

# get the alias of the first thing in the list of completions
_spack_get_alias "${COMPREPLY[0]}"
_spack_get_alias "${COMPREPLY[@]:0:1}"
local first_alias="$SPACK_ALIAS"

# if anything in the list would alias to something different, stop
Expand Down
18 changes: 16 additions & 2 deletions share/spack/spack-completion.bash
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,20 @@ if test -n "${ZSH_VERSION:-}" ; then
fi
fi

# compgen -W doesn't work in some versions of zsh, so use this instead.
# see https://www.zsh.org/mla/workers/2011/msg00582.html
_compgen_w() {
if test -n "${ZSH_VERSION:-}" ; then
typeset -a words
words=( ${~=1} )
local find="$2"
results=(${(M)words[@]:#$find*})
echo "${results[@]}"
else
compgen -W "$1" -- "$2"
fi
}

# Bash programmable completion for Spack
_bash_completion_spack() {
# In all following examples, let the cursor be denoted by brackets, i.e. []
Expand Down Expand Up @@ -137,7 +151,7 @@ _bash_completion_spack() {
if [[ "$(LC_ALL=C type $subfunction 2>&1)" =~ $rgx ]]
then
$subfunction
COMPREPLY=($(compgen -W "$SPACK_COMPREPLY" -- "$cur"))
COMPREPLY=($(_compgen_w "$SPACK_COMPREPLY" "$cur"))
fi

# if every completion is an alias for the same thing, just return that thing.
Expand Down Expand Up @@ -359,7 +373,7 @@ _spack_compress_aliases() {
fi

# get the alias of the first thing in the list of completions
_spack_get_alias "${COMPREPLY[0]}"
_spack_get_alias "${COMPREPLY[@]:0:1}"
local first_alias="$SPACK_ALIAS"

# if anything in the list would alias to something different, stop
Expand Down

0 comments on commit 6693dc5

Please sign in to comment.