Files
modules/init/bash_completion.in
Xavier Delaruelle 51c56f66ee Control whether an implicit default should be selected
Add the ability to configure whether an implicit default version should
be defined for modules with no default version explicitly defined. When
enabled, which stays the default behavior, a module version is
automatically selected (latest one) when the generic name of the module
is passed. When implicit default selection is disabled, the name of
modules to evaluate should be fully qualified elsewhere an error is
returned. This option is set at `./configure` time with the
`--enable-implicit-default` and `--disable-implicit-default` options. It
could be superseded with the `MODULES_IMPLICIT_DEFAULT` environment
variable, that could be set with `config` module sub-command throught the
`implicit_default` option.

When implicit_default is disabled:
- module implicit default versions are excluded from 'module avail -d'
  results.
- false is returned when argument passed to the 'is-avail' sub-command
  is a directory without an explicit default set in it.
- and auto_handling is enabled, the requirement load mechanism will fail
  on requirement relying on module implicit default version

Fixes #179.
2019-06-03 08:14:59 +02:00

169 lines
6.8 KiB
Bash

#
# Bash commandline completion (bash 3.0 and above)
#
_module_comgen_words_and_files() {
local k=0
local setnospace=1
# do not append space to word completed if it is a directory (ends with /)
for val in $(compgen -W "$1" -- "$2"); do
if [ !$setnospace -a "${val: -1:1}" = '/' ]; then
compopt -o nospace
setnospace=0
fi
COMPREPLY[k++]="$val"
done
}
_module_avail() {
local cur="${1:-}"
# skip avail call if word currently being completed is an option keyword
if [ -z "$cur" -o "${cur:0:1}" != '-' ]; then
module avail --color=never -t --no-indepth $cur 2>&1 | sed '
/^-\+/d; /^\s*$/d;
/->.*$/d;
/:$/d;
/:ERROR:/d;
s#^\(.*\)/\(.\+\)(.*default.*)#\1\n\1\/\2#;
s#(.*)$##g;
s#\s*$##g;'
fi
}
_module_savelist() {
module savelist --color=never -t 2>&1 | sed '
/No named collection\.$/d;
/Named collection list$/d;
/:$/d;
/:ERROR:/d;'
}
_module_not_yet_loaded() {
_module_avail ${1:-} | sort | sed -E "\%^(${LOADEDMODULES//:/|})$%d"
}
_module_long_arg_list() {
local cur="$1" i
if [[ ${COMP_WORDS[COMP_CWORD-2]} == sw* ]]
then
_module_comgen_words_and_files "$(_module_not_yet_loaded $cur)" "$cur"
return
fi
for ((i = COMP_CWORD - 1; i > 0; i--))
do case ${COMP_WORDS[$i]} in
add|load)
_module_comgen_words_and_files "$(_module_not_yet_loaded $cur)" "$cur"
break;;
rm|del|remove|unload|switch|swap)
COMPREPLY=( $(IFS=: compgen -W "${LOADEDMODULES}" -- "$cur") )
break;;
esac
done
}
@compatversion@# define completion relative to active version
@compatversion@if [ "$MODULES_USE_COMPAT_VERSION" = '1' ]; then
@compatversion@_module() {
@compatversion@ local cur="$2" prev="$3" cmds opts
@compatversion@
@compatversion@ COMPREPLY=()
@compatversion@
@compatversion@ cmds="add apropos avail clear display del help\
@compatversion@ initadd initclear initlist initprepend initrm initswitch\
@compatversion@ keyword list load purge refresh remove rm show swap switch\
@compatversion@ unload unuse update use whatis"
@compatversion@
@compatversion@ opts="-c -f -h -i -l -s -t -u -v -H -V\
@compatversion@ --create --force --help --human --icase\
@compatversion@ --long --silent --terse --userlvl --verbose --version"
@compatversion@
@compatversion@ case "$prev" in
@compatversion@ add|load) COMPREPLY=( $(compgen -W "$(_module_not_yet_loaded)" -- "$cur") );;
@compatversion@ rm|del|remove|unload|switch|swap)
@compatversion@ COMPREPLY=( $(IFS=: compgen -W "${LOADEDMODULES}" -- "$cur") );;
@compatversion@ unuse) COMPREPLY=( $(IFS=: compgen -W "${MODULEPATH}" -- "$cur") );;
@compatversion@ use|*-a*) ;; # let readline handle the completion
@compatversion@ -u|--userlvl) COMPREPLY=( $(compgen -W "novice expert advanced" -- "$cur") );;
@compatversion@ av*|disp*|help|show|whatis)
@compatversion@ COMPREPLY=( $(compgen -W "$(_module_avail)" -- "$cur") );;
@compatversion@ *) if test $COMP_CWORD -gt 2
@compatversion@ then
@compatversion@ _module_long_arg_list "$cur"
@compatversion@ else
@compatversion@ case "$cur" in
@compatversion@ # The mappings below are optional abbreviations for convenience
@compatversion@ ls) COMPREPLY="list";; # map ls -> list
@compatversion@ r*) COMPREPLY="rm";; # also covers 'remove'
@compatversion@ sw*) COMPREPLY="switch";;
@compatversion@
@compatversion@ -*) COMPREPLY=( $(compgen -W "$opts" -- "$cur") );;
@compatversion@ *) COMPREPLY=( $(compgen -W "$cmds" -- "$cur") );;
@compatversion@ esac
@compatversion@ fi;;
@compatversion@ esac
@compatversion@}
@compatversion@else
_module() {
local cur="$2" prev="$3" cmds opts
COMPREPLY=()
cmds="add apropos aliases avail append-path clear config del display help\
initadd initclear initlist initprepend initrm is-loaded is-saved\
is-used is-avail info-loaded keyword list load path paths purge\
prepend-path refresh reload restore rm remove remove-path save\
savelist saveshow saverm search show source swap switch test unload\
unuse use whatis"
opts="-D -h -V --debug --help --version --paginate --no-pager --color --color="
load_opts="--auto --no-auto --force -f"
list_opts="-l -t --long --terse"
clear_opts="--force -f"
path_opts="-d --delim --duplicates"
rm_path_opts="-d --delim --index"
avail_opts="-d -L -l -t --default --latest --long --terse --indepth --no-indepth"
config_opts="--dump-state --reset allow_extra_siteconfig contact auto_handling\
avail_indepth collection_pin_version collection_target color colors\
extra_siteconfig implicit_default pager rcfile run_quarantine\
silent_shell_debug term_background unload_match_order"
case "$prev" in
add|load) _module_comgen_words_and_files "$load_opts $(_module_not_yet_loaded $cur)" "$cur";;
avail) _module_comgen_words_and_files "$avail_opts $(_module_avail $cur)" "$cur";;
list|savelist) COMPREPLY=( $(compgen -W "$list_opts" -- "$cur") );;
clear) COMPREPLY=( $(compgen -W "$clear_opts" -- "$cur") );;
restore|save|saveshow|saverm|is-saved)
COMPREPLY=( $(compgen -W "$(_module_savelist)" -- "$cur") );;
rm|del|remove|unload|switch|swap)
COMPREPLY=( $(compgen -W "$load_opts ${LOADEDMODULES//:/ }" -- "$cur") );;
unuse|is-used) COMPREPLY=( $(IFS=: compgen -W "${MODULEPATH}" -- "$cur") );;
use|-a|--append) ;; # let readline handle the completion
display|help|show|test|whatis|is-loaded|is-avail|info-loaded)
_module_comgen_words_and_files "$(_module_avail $cur)" "$cur";;
config|--reset) COMPREPLY=( $(compgen -W "$config_opts" -- "$cur") );;
-h|--help|-V|--version|aliases|apropos|keyword|purge|refresh|reload|search|source)
;;
append-path|prepend-path)
COMPREPLY=( $(compgen -W "$path_opts" -- "$cur") );;
remove-path)
COMPREPLY=( $(compgen -W "$rm_path_opts" -- "$cur") );;
initadd|initclear|initlist|initprepend|initrm)
;;
*) if test $COMP_CWORD -gt 2
then
_module_long_arg_list "$cur"
else
case "$cur" in
# The mappings below are optional abbreviations for convenience
ls) COMPREPLY="list";; # map ls -> list
sw*) COMPREPLY="switch";;
-*) COMPREPLY=( $(compgen -W "$opts" -- "$cur") );;
*) COMPREPLY=( $(compgen -W "$opts $cmds" -- "$cur") );;
esac
fi;;
esac
}
@compatversion@fi
complete -o default -F _module module