summary refs log tree commit diff
path: root/Completion/Unix/Command/_module
blob: 86598764033df259c3c703d0c8b6160057e554c8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#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
  else
    local curcontext="$curcontext" ret

    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 -L ${(e)=MODULEPATH//:/ } -type 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
  _multi_parts / "($_available_modules)"
}

# Completion function for load|add
(( $+functions[_module_load] )) || _module_load()
{
  _module_available_modules
  _multi_parts / "($_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
  _multi_parts / "($_available_modules)"
}

# Completion function for display|show
(( $+functions[_module_display] )) || _module_display()
{
  _module_available_modules
  _multi_parts / "($_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
  _multi_parts / "($_available_modules)"
}

# Completion function for initadd
(( $+functions[_module_initadd] )) || _module_initadd()
{
  _module_available_modules
  _multi_parts / "($_available_modules)"
}

# Completion function for initprepend
(( $+functions[_module_initprepend] )) || _module_initprepend()
{
  _module_available_modules
  _multi_parts / "($_available_modules)"
}

# Completion function for initrm
(( $+functions[_module_initrm] )) || _module_initrm()
{
  _module_available_modules
  _multi_parts / "($_available_modules)"
}

# Completion function for initswitch
(( $+functions[_module_initswitch] )) || _module_initswitch()
{
  _module_available_modules
  _multi_parts / "($_available_modules)"
}

_module "$@"