about summary refs log tree commit diff
diff options
context:
space:
mode:
authorClint Adams <clint@users.sourceforge.net>2007-03-24 15:43:12 +0000
committerClint Adams <clint@users.sourceforge.net>2007-03-24 15:43:12 +0000
commitc5ac4796428d1f2bb688e0fa4e593b476bc0ba4a (patch)
treea04db95202a318728c83cc80aed1ac50310e31d3
parentf69f1ded8ca5d21e47fd719463dba8319bf4f633 (diff)
downloadzsh-c5ac4796428d1f2bb688e0fa4e593b476bc0ba4a.tar.gz
zsh-c5ac4796428d1f2bb688e0fa4e593b476bc0ba4a.tar.xz
zsh-c5ac4796428d1f2bb688e0fa4e593b476bc0ba4a.zip
23236: Daniel Qarras: enhancements for _module.
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Unix/Command/_module200
2 files changed, 180 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index 79d11434d..f38f5ae5a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-03-24  Clint Adams  <clint@zsh.org>
+
+	* 23236: Daniel Qarras: Completion/Unix/Command/_module:
+	enhancements for _module.
+
 2007-03-23  Peter Stephenson  <pws@csr.com>
 
 	* unposted, see followups to 23232: Doc/Zsh/builtins.yo:
diff --git a/Completion/Unix/Command/_module b/Completion/Unix/Command/_module
index b44dbdb60..1df12a3d9 100644
--- a/Completion/Unix/Command/_module
+++ b/Completion/Unix/Command/_module
@@ -1,29 +1,179 @@
 #compdef module
 
-local context state line
-typeset -A opt_args
-
-_arguments \
-  '(-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]' \
-  '(-i --icase)'{--icase,-i}'[case insensitive]' \
-  '(-u --userlvl)'{--userlvl,-u}'[set user level to value]:level:(novice expert advanced)' \
-  '*::command:->subcmds' && return 0
-
-case "$state" in
-  (subcmds)
-    if (( CURRENT == 1 )); then
-      compadd -- help load add unload rm switch swap display show list \
-                 avail use unuse update clear purge whatis apropos keyword \
-		 initadd initprepend initswitch initlist initclear
+# 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
-      _files
+      _message "unknown module command: $words[1]"
     fi
-  ;;
-esac
+
+    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'))
+  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 "$@"