From 6693dc5eb82f1dc7266a7785a531ddf2a0cd22f4 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 26 Aug 2023 23:19:55 -0700 Subject: 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` --- share/spack/bash/spack-completion.bash | 18 ++++++++++++++++-- share/spack/spack-completion.bash | 18 ++++++++++++++++-- 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 -- cgit v1.2.3-70-g09d2