summaryrefslogtreecommitdiff
path: root/share
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2023-08-26 23:19:55 -0700
committerTodd Gamblin <tgamblin@llnl.gov>2023-08-30 12:42:31 -0700
commit6693dc5eb82f1dc7266a7785a531ddf2a0cd22f4 (patch)
tree9ef02ef8f47396430bab38598713c0c26055267a /share
parent396f21901160afd54adf21970f22f92c38006bef (diff)
downloadspack-6693dc5eb82f1dc7266a7785a531ddf2a0cd22f4.tar.gz
spack-6693dc5eb82f1dc7266a7785a531ddf2a0cd22f4.tar.bz2
spack-6693dc5eb82f1dc7266a7785a531ddf2a0cd22f4.tar.xz
spack-6693dc5eb82f1dc7266a7785a531ddf2a0cd22f4.zip
completion: make bash completion work in zsh
`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`
Diffstat (limited to 'share')
-rwxr-xr-xshare/spack/bash/spack-completion.bash18
-rwxr-xr-xshare/spack/spack-completion.bash18
2 files changed, 32 insertions, 4 deletions
diff --git a/share/spack/bash/spack-completion.bash b/share/spack/bash/spack-completion.bash
index c0ead13813..d779e90aac 100755
--- a/share/spack/bash/spack-completion.bash
+++ b/share/spack/bash/spack-completion.bash
@@ -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. []
@@ -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.
@@ -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
diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash
index 91e34045b4..63e1aa6d5c 100755
--- a/share/spack/spack-completion.bash
+++ b/share/spack/spack-completion.bash
@@ -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. []
@@ -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.
@@ -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