mirror of
https://github.com/envmodules/modules.git
synced 2026-06-10 00:56:30 +08:00
363 lines
16 KiB
Plaintext
363 lines
16 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 -s -t -S --no-indepth -o '' $cur 2>&1
|
|
fi
|
|
}
|
|
|
|
_module_savelist() {
|
|
module savelist --color=never -s -t 2>&1 | sed '
|
|
/No named collection\.$/d;
|
|
/Named collection list$/d;
|
|
/:$/d;'
|
|
}
|
|
|
|
_module_stashlist() {
|
|
module stashlist --color=never -s -t 2>&1 | sed '
|
|
/No stash collection\.$/d;
|
|
/Stash collection list$/d;
|
|
/:$/d;'
|
|
}
|
|
|
|
_module_not_yet_loaded() {
|
|
_module_avail ${1:-} | sort | @SED_ERE@ "\%^(${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_stash_colls() {
|
|
local -a stash_colls;
|
|
stash_colls=(${$(_module_stashlist)})
|
|
|
|
_describe -t stash-colls 'stash collections' stash_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 \
|
|
'(-T --trace)'{-T,--trace}'[Enable trace and debug messages]' \
|
|
'(-D --debug)'{-D,--debug}'[Enable debug messages]' \
|
|
'(-v --verbose)'{-v,--verbose}'[Enable verbose messages]' \
|
|
'(-s --silent)'{-s,--silent}'[Turn off error, warning and informational messages]' \
|
|
'(-h --help)'{-h,--help}'[Usage info]' \
|
|
'(-V --version)'{-V,--version}'[Module version]' \
|
|
'(-w --width=)'{-w,--width=}'[Set output width]' \
|
|
'--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]' \
|
|
'--ignore-cache[Ignore module cache]' \
|
|
'(-): :->cmd' \
|
|
'(-)*:: :->arg' && ret=0
|
|
|
|
case $state in
|
|
(cmd)
|
|
local -a cmds; cmds=(
|
|
'add:Load modulefile(s)'
|
|
'load:Load modulefile(s)'
|
|
'add-any:Load first available modulefile in list'
|
|
'load-any:Load first available modulefile in list'
|
|
'try-add:Attempt to load modulefile(s), no complain'
|
|
'try-load:Attempt to load modulefile(s), no complain'
|
|
'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:Refresh volatile components of 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'
|
|
'sh-to-mod:Make modulefile from script env changes'
|
|
'edit:Open modulefile in editor'
|
|
'state:Display Modules state'
|
|
'lint:Check syntax of modulefile'
|
|
'mod-to-sh:Make shell code from modulefile env changes'
|
|
'reset:Restore initial environment'
|
|
'stash:Save current environment and reset'
|
|
'stashclear:Remove all stash collections'
|
|
'stashlist:List all stash collections'
|
|
'stashpop:Restore then remove stash collection'
|
|
'stashrm:Remove stash collection'
|
|
'stashshow:Display information about stash collection'
|
|
'cachebuild:Create cache file for modulepath(s)'
|
|
'cacheclear:Delete cache file in enabled modulepath(s)'
|
|
)
|
|
# 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|load-any|add-any|try-load|try-add)
|
|
_arguments \
|
|
'--auto[Enable automated module handling mode]' \
|
|
'--no-auto[Disable automated module handling mode]' \
|
|
'(-f --force)'{-f,--force}'[By-pass dependency consistency]' \
|
|
'(-i --icase)'{-i,--icase}'[Case insensitive match]' \
|
|
'--tag=[Apply tag to loading module]' \
|
|
"*::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]' \
|
|
'(-j --json)'{-j,--json}'[Display output in JSON format]' \
|
|
'(-o --output=)'{-o,--output=}'[Define elements to output in addition to module names]' \
|
|
'(-a --all)'{-a,--all}'[Include hidden modules in search]' \
|
|
'(-d --default)'{-d,--default}'[Only show default versions available]' \
|
|
'(-L --latest)'{-L,--latest}'[Only show latest versions available]' \
|
|
'(-i --icase)'{-i,--icase}'[Case insensitive match]' \
|
|
'(-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
|
|
;;
|
|
(aliases)
|
|
_arguments \
|
|
'(-a --all)'{-a,--all}'[Include hidden modules in search]' && ret=0
|
|
;;
|
|
(list)
|
|
_arguments \
|
|
'(-l --long)'{-l,--long}'[Display output in long format]' \
|
|
'(-t --terse)'{-t,--terse}'[Display output in terse format]' \
|
|
'(-j --json)'{-j,--json}'[Display output in JSON format]' \
|
|
'(-o --output=)'{-o,--output=}'[Define elements to output in addition to module names]' \
|
|
'(-a --all)'{-a,--all}'[Include hidden modules in list]' && ret=0
|
|
;;
|
|
(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'
|
|
'-j:Display output in JSON format'
|
|
'--json:Display output in JSON format'
|
|
'-o:Define elements to output in addition to module names'
|
|
'--output=:Define elements to output in addition to module names'
|
|
)
|
|
_describe -t opts 'Switches' opts && ret=0
|
|
;;
|
|
(stashlist)
|
|
_arguments \
|
|
'(-l --long)'{-l,--long}'[Display output in long format]' \
|
|
'(-t --terse)'{-t,--terse}'[Display output in terse format]' \
|
|
'(-j --json)'{-j,--json}'[Display output in JSON format]' && ret=0
|
|
;;
|
|
(stashpop|stashshow|stashrm)
|
|
_alternative 'avail-stashs:collections:{_module_stash_colls}' \
|
|
&& 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]' \
|
|
'(-i --icase)'{-i,--icase}'[Case insensitive match]' \
|
|
'*::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]' \
|
|
'(-i --icase)'{-i,--icase}'[Case insensitive match]' \
|
|
'--tag=[Apply tag to loading module]' \
|
|
'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
|
|
;;
|
|
(cachebuild)
|
|
_arguments \
|
|
'*:modulepath:_files -/' && ret=0
|
|
;;
|
|
(display|help|show|test|path|paths|is-loaded|info-loaded)
|
|
_arguments \
|
|
'(-i --icase)'{-i,--icase}'[Case insensitive match]' \
|
|
"*::modulefile:{_module_avail_mods $cur}" && ret=0
|
|
;;
|
|
(is-avail)
|
|
_arguments \
|
|
'(-i --icase)'{-i,--icase}'[Case insensitive match]' \
|
|
'(-a --all)'{-a,--all}'[Include hidden modules in search]' \
|
|
"*::modulefile:{_module_avail_mods $cur}" && ret=0
|
|
;;
|
|
(whatis)
|
|
_arguments \
|
|
'(-i --icase)'{-i,--icase}'[Case insensitive match]' \
|
|
'(-j --json)'{-j,--json}'[Display output in JSON format]' \
|
|
'(-a --all)'{-a,--all}'[Include hidden modules in search]' \
|
|
"*::modulefile:{_module_avail_mods $cur}" && ret=0
|
|
;;
|
|
(apropos|keyword|search)
|
|
_arguments \
|
|
'(-j --json)'{-j,--json}'[Display output in JSON format]' \
|
|
'(-a --all)'{-a,--all}'[Include hidden modules in search]' \
|
|
&& 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:(advanced_version_spec auto_handling avail_indepth avail_output avail_terse_output cache_buffer_bytes cache_expiry_secs collection_pin_version collection_pin_tag collection_target color colors contact editor extended_default extra_siteconfig home icase ignore_cache implicit_default implicit_requirement list_output list_terse_output locked_configs mcookie_check mcookie_version_check ml nearly_forbidden_days pager protected_envvars quarantine_support rcfile redirect_output reset_target_state run_quarantine search_match set_shell_startup shells_with_ksh_fpath silent_shell_debug tag_abbrev tag_color_name tcl_linter term_background term_width unload_match_order variant_shortcut verbosity wa_277)' \
|
|
&& ret=0
|
|
;;
|
|
(edit)
|
|
_arguments \
|
|
"*::modulefile:{_module_avail_mods $cur}" && ret=0
|
|
;;
|
|
(lint)
|
|
_arguments \
|
|
'(-i --icase)'{-i,--icase}'[Case insensitive match]' \
|
|
'(-a --all)'{-a,--all}'[Include hidden modules in search]' \
|
|
"*::modulefile:{_module_avail_mods $cur}" && ret=0
|
|
;;
|
|
(mod-to-sh)
|
|
_arguments \
|
|
'--auto[Enable automated module handling mode]' \
|
|
'--no-auto[Disable automated module handling mode]' \
|
|
'(-f --force)'{-f,--force}'[By-pass dependency consistency]' \
|
|
'(-i --icase)'{-i,--icase}'[Case insensitive match]' \
|
|
"*::modulefile:{_module_notloaded_mods $cur}" && ret=0
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
}
|
|
|
|
_module "$@"
|
|
|
|
# vim:set tabstop=3 shiftwidth=3 expandtab autoindent:
|