#compdef module # Main dispatcher _module() { _arguments -s \ '(-H --help)'{--help,-H}'[display usage info]' \ '(-V --version)'{--version,-V}'[module command version and configuration options]' \ '(-f --force)'{--force,-f}'[force active dependency resolution]' \ '(-t --terse)'{--terse,-t}'[display avail and list output in short format]' \ '(-l --long)'{--long,-l}'[display avail and list output in long format]' \ '(-h --human)'{--human,-h}'[display short output in human-readable format]' \ '(-v --verbose)'{--verbose,-v}'[verbose]' \ '(-s --silent)'{--silent,-s}'[disable verbose messages]' \ '(-c --create)'{--create,-c}'[create caches]' \ '(-i --icase)'{--icase,-i}'[case insensitive]' \ '(-u --userlvl)'{--userlvl,-u}'[set user level to value]:level:(novice expert advanced)' \ '*::module command:_module_command' } (( $+functions[_module_command] )) || _module_command() { local -a _module_cmds _module_cmds=( "help:print the usage of each sub-command" "load:load a module into the shell environment" "add:load a module into the shell environment" "unload:remove a module from the shell environment" "rm:remove a module from the shell environment" "switch:switch loaded a loaded module with another module" "swap:switch loaded a loaded module with another module" "display:display information about a module" "show:display information about a module" "list:list loaded modules" "avail:list all available modules" "use:add a directory to MODULEPATH" "unuse:remove a directory from MODULEPATH" "update:reload all loaded modules" "clear:clear loaded modules information" "purge:unload all loaded modules" "refresh:refresh all non-persistent components of loaded modules" "whatis:display module information" "appropos:search for a given keyword in modules" "keyword:search for a given keyword in modules" "initadd:add or append a module to the user's shell init file" "initprepend:add or prepend a module to the user's shell init files" "initrm:remove a module from the user's shell init file" "initswitch:switch modules in the user's shell init file" "initlist:list all loaded modules in the user's shell init files" "initclear:clear all modules from the user's shell init files" ) if (( CURRENT == 1 )); then _describe -t commands 'module command' _module_cmds || compadd "$@" else local curcontext="$curcontext" cmd="${${_module_cmds[(r)$words[1]:*]%%:*}}" # Deal with any aliases case $cmd in add) cmd="load";; rm) cmd="unload";; swap) cmd="switch";; show) cmd="display";; keyword) cmd="apropos";; esac if (( $#cmd )); then local update_policy curcontext="${curcontext%:*:*}:module-${cmd}:" zstyle -s ":completion:${curcontext}:" cache-policy update_policy _call_function ret _module_$cmd || _message 'no more arguments' else _message "unknown module command: $words[1]" fi return ret fi } # Fills the available modules cache _module_available_modules() { if [[ -n $MODULEPATH ]] && [[ ${+_available_modules} -eq 0 ]] then _available_modules=(${$(find ${(e)=MODULEPATH//:/ } -xtype f -print 2>/dev/null | grep -v \\.version | sed -e 's,\('${${(e)=MODULEPATH//:/\/\\\|}%\\\|}'\),,g' -e 's,^/*,,g'):#*\~}) fi } # Completion function for help (( $+functions[_module_help] )) || _module_help() { _module_available_modules compadd "$@" -a -- _available_modules } # Completion function for load|add (( $+functions[_module_load] )) || _module_load() { _module_available_modules compadd "$@" -a -- _available_modules } # Completion function for unload|rm (( $+functions[_module_unload] )) || _module_unload() { compadd "$@" -- ${=LOADEDMODULES//:/ } } # Completion function for switch|swap (( $+functions[_module_switch] )) || _module_switch() { # Actually first argument could be a loaded module _module_available_modules compadd "$@" -a -- _available_modules } # Completion function for display|show (( $+functions[_module_display] )) || _module_display() { _module_available_modules compadd "$@" -a -- _available_modules } # Completion function for avail ### No completion (yet?) # Completion function for use (( $+functions[_module_use] )) || _module_use() { _arguments -s \ '(-a --append)'{--append,-a}'[append the directories instead of prepending]' \ '*:directory:_files -/' } # Completion function for unuse (( $+functions[_module_unuse] )) || _module_unuse() { compadd "$@" -- ${=MODULEPATH//:/ } } # Completion function for whatis (( $+functions[_module_whatis] )) || _module_whatis() { _module_available_modules compadd "$@" -a -- _available_modules } # Completion function for initadd (( $+functions[_module_initadd] )) || _module_initadd() { _module_available_modules compadd "$@" -a -- _available_modules } # Completion function for initprepend (( $+functions[_module_initprepend] )) || _module_initprepend() { _module_available_modules compadd "$@" -a -- _available_modules } # Completion function for initrm (( $+functions[_module_initrm] )) || _module_initrm() { _module_available_modules compadd "$@" -a -- _available_modules } # Completion function for initswitch (( $+functions[_module_initswitch] )) || _module_initswitch() { _module_available_modules compadd "$@" -a -- _available_modules } _module "$@"