Files
modules/init/zsh-functions/_module
Xavier Delaruelle 3ba2851767 Add ability to control module search match
Introduce the ability to control the module search match. Search query
string should match module name start or any part of module fully
qualified name. Default search match behavior is set at ``./configure``
time with the ``--with-search-match`` option. It could be superseded
with the ``MODULES_SEARCH_MATCH`` environment variable, that could be
set with ``config`` module sub-command through the ``search_match``
option. Command-line switches ``--starts-with`` (``-S``) and
``--contains`` (``-C``) for ``avail`` module sub-command enable to
supersede defined search match configuration.
2019-07-02 05:39:15 +02:00

257 lines
9.9 KiB
Plaintext

#compdef module
#
# Zsh command-line completion for module
# Copyright (C) 2017 Xavier Delaruelle <xavier.delaruelle@cea.fr>
#
_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 -S --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_avail_mods() {
local -a avail_mods;
local suffix=' ';
avail_mods=(${$(_module_avail $cur ${1:-})})
# do not append space to word completed if it is a directory (ends with /)
for val in $avail_mods; do
if [ "${val: -1:1}" = '/' ]; then
suffix=''
break
fi
done
compadd -S "$suffix" -a avail_mods && ret=0
}
_module_saved_colls() {
local -a saved_colls;
saved_colls=(${$(_module_savelist)})
_describe -t saved-colls 'saved collections' saved_colls && ret=0
}
_module_notloaded_mods() {
local -a not_yet_loaded_mods;
local suffix=' ';
not_yet_loaded_mods=(${$(_module_not_yet_loaded ${1:-})})
# do not append space to word completed if it is a directory (ends with /)
for val in $not_yet_loaded_mods; do
if [ "${val: -1:1}" = '/' ]; then
suffix=''
break
fi
done
compadd -S "$suffix" -a not_yet_loaded_mods && ret=0
}
_module_loaded_mods() {
local -a loaded_mods;
loaded_mods=(${=LOADEDMODULES//:/ })
_describe -t loaded-mods 'loaded modulefiles' loaded_mods && ret=0
}
_module_used_paths() {
local -a used_paths;
used_paths=(${=MODULEPATH//:/ })
_describe -t used-paths 'enabled modulepaths' used_paths && ret=0
}
_module() {
typeset -A opt_args
_arguments -C \
'(-D --debug)'{-D,--debug}'[Enable debug messages]' \
'(-h --help)'{-h,--help}'[Usage info]' \
'(-V --version)'{-V,--version}'[Module version]' \
'--paginate[Pipe mesg output into a pager if stream attached to terminal]' \
'--no-pager[Do not pipe message output into a pager]' \
'(--color --color=)'{--color,--color=}'[Colorize the output]' \
'(-): :->cmd' \
'(-)*:: :->arg' && ret=0
case $state in
(cmd)
local -a cmds; cmds=(
'add:Load modulefile(s)'
'load:Load modulefile(s)'
'rm:Remove modulefile(s)'
'remove:Remove modulefile(s)'
'del:Remove modulefile(s)'
'unload:Remove modulefile(s)'
'purge:Unload all loaded modulefiles'
'reload:Unload then load all loaded modulefiles'
'refresh:Unload then load all loaded modulefiles'
'switch:Unload mod1 and load mod2'
'swap:Unload mod1 and load mod2'
'list:List loaded modules'
'avail:List all or matching available modules'
'is-avail:Is any of the modulefile(s) available'
'is-loaded:Test if any of the modulefile(s) are loaded'
'info-loaded:Get full name of matching loaded module(s)'
'aliases:List all module aliases'
'whatis:Print whatis information of modulefile(s)'
'apropos:Search all name and whatis containing str'
'keyword:Search all name and whatis containing str'
'search:Search all name and whatis containing str'
'save:Save current module list to collection'
'restore:Restore module list from collection or file'
'saverm:Remove saved collection'
'saveshow:Display information about collection'
'savelist:List all saved collections'
'is-saved:Test if any of the collection(s) exists'
'initlist:List all modules loaded from init file'
'initadd:Add modulefile to shell init file'
'initrm:Remove modulefile from shell init file'
'initprepend:Add to beginning of list in init file'
'initswitch:Switch mod1 with mod2 from init file'
'initclear:Clear all modulefiles from init file'
'help:Print this or modulefile(s) help info'
'display:Display information about modulefile(s)'
'show:Display information about modulefile(s)'
'test:Test modulefile(s)'
'use:Add dir(s) to MODULEPATH variable'
'unuse:Remove dir(s) from MODULEPATH variable'
'is-used:Is any of the dir(s) enabled in MODULEPATH'
'path:Print modulefile path'
'paths:Print path of matching available modules'
'source:Execute scriptfile(s)'
'append-path:Append value to environment variable'
'prepend-path:Prepend value to environment variable'
'remove-path:Remove value from environment variable'
'clear:Reset Modules-specific runtime information'
'config:Display or set Modules configuration'
)
# show commands only with compatible options
if (( !$+opt_args[-h] && !$+opt_args[--help] \
&& !$+opt_args[-V] && !$+opt_args[--version] )); then
_describe -t cmds 'Module Sub-Commands' cmds && ret=0
fi
;;
(arg)
local cmd="${words[1]}"
local cur="${words[CURRENT]}"
case $cmd in
(load|add)
_arguments \
'--auto[Enable automated module handling mode]' \
'--no-auto[Disable automated module handling mode]' \
'(-f --force)'{-f,--force}'[By-pass dependency consistency]' \
"*::modulefile:{_module_notloaded_mods $cur}" && ret=0
;;
(avail)
_arguments \
'(-l --long)'{-l,--long}'[Display output in long format]' \
'(-t --terse)'{-t,--terse}'[Display output in terse format]' \
'(-d --default)'{-d,--default}'[Only show default versions available]' \
'(-L --latest)'{-L,--latest}'[Only show latest versions available]' \
'(-S --starts-with)'{-S,--starts-with}'[Search modules whose name begins with query string]' \
'(-C --contains)'{-C,--contains}'[Search modules whose name contains query string]' \
'--indepth[Perform recursive avail search]' \
'--no-indepth[Perform non-recursive avail search]' \
"*::modulefile:{_module_avail_mods $cur}" && ret=0
;;
(list|savelist)
local -a opts; opts=(
'-l:Display output in long format'
'--long:Display output in long format'
'-t:Display output in terse format'
'--terse:Display output in terse format'
)
_describe -t opts 'Switches' opts && ret=0
;;
(clear)
_arguments \
'(-f --force)'{-f,--force}'[Skip confirmation dialog]' && ret=0
;;
(restore|save|saveshow|saverm|is-saved)
_alternative 'avail-colls:collections:{_module_saved_colls}' \
&& ret=0
;;
(rm|del|remove|unload)
_arguments \
'--auto[Enable automated module handling mode]' \
'--no-auto[Disable automated module handling mode]' \
'(-f --force)'{-f,--force}'[By-pass dependency consistency]' \
'*::modulefile:_module_loaded_mods' && ret=0
;;
(switch|swap)
_arguments \
'--auto[Enable automated module handling mode]' \
'--no-auto[Disable automated module handling mode]' \
'(-f --force)'{-f,--force}'[By-pass dependency consistency]' \
'1:loaded modulefile:_module_loaded_mods' \
"2:modulefile:{_module_notloaded_mods $cur}" && ret=0
;;
(unuse|is-used)
_alternative 'used-paths:modulepaths:{_module_used_paths}' \
&& ret=0
;;
(use)
_arguments \
'(-a --append)'{-a,--append}'[Append directory to MODULEPATH]' \
'(-p --prepend)'{-p,--prepend}'[Prepend directory to MODULEPATH]' \
'*:modulepath:_files -/' && ret=0
;;
(display|help|show|test|whatis|is-loaded|is-avail|info-loaded)
_alternative "avail-mods:modulefiles:{_module_avail_mods $cur}" \
&& ret=0
;;
(append-path|prepend-path)
_arguments \
'(-d --delim)'{-d,--delim}'[Path element separator]' \
'--duplicates[Duplicate existing element]' \
&& ret=0
;;
(remove-path)
_arguments \
'(-d --delim)'{-d,--delim}'[Path element separator]' \
'--index[Remove path element with index]' \
&& ret=0
;;
(config)
_arguments \
'--dump-state[Report each state value of current Modules execution]' \
'--reset[Unset environment variable relative to configuration key]' \
'1:configuration key:(contact auto_handling avail_indepth collection_pin_version collection_target color colors extra_siteconfig implicit_default locked_configs pager rcfile run_quarantine search_match silent_shell_debug term_background unload_match_order)' \
&& ret=0
;;
esac
;;
esac
}
_module "$@"
# vim:set tabstop=3 shiftwidth=3 expandtab autoindent: