diff options
Diffstat (limited to 'share')
-rwxr-xr-x | share/spack/bash/spack-completion.in | 15 | ||||
-rwxr-xr-x | share/spack/qa/completion-test.sh | 76 | ||||
-rwxr-xr-x | share/spack/qa/run-shell-tests | 1 | ||||
-rwxr-xr-x | share/spack/setup-env.sh | 2 | ||||
-rwxr-xr-x | share/spack/spack-completion.bash | 15 |
5 files changed, 74 insertions, 35 deletions
diff --git a/share/spack/bash/spack-completion.in b/share/spack/bash/spack-completion.in index 80ba94ed87..9aa890ed02 100755 --- a/share/spack/bash/spack-completion.in +++ b/share/spack/bash/spack-completion.in @@ -37,6 +37,17 @@ # # See `man bash` for more details. +if test -n "${ZSH_VERSION:-}" ; then + if [[ "$(emulate)" = zsh ]] ; then + # ensure base completion support is enabled, ignore insecure directories + autoload -U +X compinit && compinit -i + # ensure bash compatible completion support is enabled + autoload -U +X bashcompinit && bashcompinit + emulate sh -c "source '$0:A'" + return # stop interpreting file + fi +fi + # Bash programmable completion for Spack _bash_completion_spack() { # In all following examples, let the cursor be denoted by brackets, i.e. [] @@ -117,7 +128,9 @@ _bash_completion_spack() { #_test_vars >> temp # Make sure function exists before calling it - if [[ "$(type -t $subfunction)" == "function" ]] + local rgx #this dance is necessary to cover bash and zsh regex + rgx="$subfunction.*function.* " + if [[ "$(type $subfunction 2>&1)" =~ $rgx ]] then $subfunction COMPREPLY=($(compgen -W "$SPACK_COMPREPLY" -- "$cur")) diff --git a/share/spack/qa/completion-test.sh b/share/spack/qa/completion-test.sh index 59a5181b98..64f07f69c4 100755 --- a/share/spack/qa/completion-test.sh +++ b/share/spack/qa/completion-test.sh @@ -31,13 +31,18 @@ title "Testing spack-completion.$_sp_shell with $_sp_shell" succeeds which spack title 'Testing all subcommands' -while IFS= read -r line +# read line into an array portably +READ="read -ra line" +if [ -n "${ZSH_VERSION:-}" ]; then + READ=(read -rA line) +fi +while IFS=' ' $READ do # Test that completion with no args works - succeeds _spack_completions ${line[*]} '' + succeeds _spack_completions "${line[@]}" '' # Test that completion with flags works - contains '-h --help' _spack_completions ${line[*]} - + contains '-h --help' _spack_completions "${line[@]}" - done <<- EOF $(spack commands --aliases --format=subcommands) EOF @@ -58,32 +63,39 @@ contains 'hdf5' _spack_completions spack install -v '' # XFAIL: Fails for Python 2.6 because pkg_resources not found? #contains 'compilers.py' _spack_completions spack unit-test '' -title 'Testing debugging functions' - -# This is a particularly tricky case that involves the following situation: -# `spack -d [] install ` -# Here, [] represents the cursor, which is in the middle of the line. -# We should tab-complete optional flags for `spack`, not optional flags for -# `spack install` or package names. -COMP_LINE='spack -d install ' -COMP_POINT=9 -COMP_WORDS=(spack -d install) -COMP_CWORD=2 -COMP_KEY=9 -COMP_TYPE=64 - -_bash_completion_spack -contains "--all-help" echo "${COMPREPLY[@]}" - -contains "['spack', '-d', 'install', '']" _pretty_print COMP_WORDS[@] - -# Set the rest of the intermediate variables manually -COMP_WORDS_NO_FLAGS=(spack install) -COMP_CWORD_NO_FLAGS=1 -subfunction=_spack -cur= - -list_options=true -contains "'True'" _test_vars -list_options=false -contains "'False'" _test_vars +_test_debug_functions() { + title 'Testing debugging functions' + + if [ -n "${ZSH_VERSION:-}" ]; then + emulate -L sh + fi + + # This is a particularly tricky case that involves the following situation: + # `spack -d [] install ` + # Here, [] represents the cursor, which is in the middle of the line. + # We should tab-complete optional flags for `spack`, not optional flags for + # `spack install` or package names. + COMP_LINE='spack -d install ' + COMP_POINT=9 + COMP_WORDS=(spack -d install) + COMP_CWORD=2 + COMP_KEY=9 + COMP_TYPE=64 + + _bash_completion_spack + contains "--all-help" echo "${COMPREPLY[@]}" + + contains "['spack', '-d', 'install', '']" _pretty_print COMP_WORDS[@] + + # Set the rest of the intermediate variables manually + COMP_WORDS_NO_FLAGS=(spack install) + COMP_CWORD_NO_FLAGS=1 + subfunction=_spack + cur= + + list_options=true + contains "'True'" _test_vars + list_options=false + contains "'False'" _test_vars +} +_test_debug_functions diff --git a/share/spack/qa/run-shell-tests b/share/spack/qa/run-shell-tests index 9c5302ec89..310a824e42 100755 --- a/share/spack/qa/run-shell-tests +++ b/share/spack/qa/run-shell-tests @@ -43,6 +43,7 @@ fi # Run the test scripts for their output (these will print nicely) zsh "$QA_DIR/setup-env-test.sh" +zsh "$QA_DIR/completion-test.sh" dash "$QA_DIR/setup-env-test.sh" # Run fish tests diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh index 5761d16362..7f648207e4 100755 --- a/share/spack/setup-env.sh +++ b/share/spack/setup-env.sh @@ -371,7 +371,7 @@ _sp_multi_pathadd MODULEPATH "$_sp_tcl_roots" # Add programmable tab completion for Bash # -if [ "$_sp_shell" = bash ]; then +if test "$_sp_shell" = bash || test -n "${ZSH_VERSION:-}"; then source $_sp_share_dir/spack-completion.bash fi diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 1761fcb60d..0143d305ca 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -37,6 +37,17 @@ # # See `man bash` for more details. +if test -n "${ZSH_VERSION:-}" ; then + if [[ "$(emulate)" = zsh ]] ; then + # ensure base completion support is enabled, ignore insecure directories + autoload -U +X compinit && compinit -i + # ensure bash compatible completion support is enabled + autoload -U +X bashcompinit && bashcompinit + emulate sh -c "source '$0:A'" + return # stop interpreting file + fi +fi + # Bash programmable completion for Spack _bash_completion_spack() { # In all following examples, let the cursor be denoted by brackets, i.e. [] @@ -117,7 +128,9 @@ _bash_completion_spack() { #_test_vars >> temp # Make sure function exists before calling it - if [[ "$(type -t $subfunction)" == "function" ]] + local rgx #this dance is necessary to cover bash and zsh regex + rgx="$subfunction.*function.* " + if [[ "$(type $subfunction 2>&1)" =~ $rgx ]] then $subfunction COMPREPLY=($(compgen -W "$SPACK_COMPREPLY" -- "$cur")) |