diff --git a/doc/source/module.rst b/doc/source/module.rst index bb791db4..8d4840c1 100644 --- a/doc/source/module.rst +++ b/doc/source/module.rst @@ -432,6 +432,24 @@ Module Sub-Commands Print path of available *modulefiles* matching argument. +**append-path** [-d C|--delim C|--delim=C] variable value + + Append *value* to environment *variable*. The *variable* is a colon, or + *delimiter*, separated list. See **append-path** in the :ref:`modulefile(4)` + man page for further explanation. + +**prepend-path** [-d C|--delim C|--delim=C] variable value + + Prepend *value* to environment *variable*. The *variable* is a colon, or + *delimiter*, separated list. See **prepend-path** in the :ref:`modulefile(4)` + man page for further explanation. + +**remove-path** [-d C|--delim C|--delim=C] variable value + + Remove *value* from the colon, or *delimiter*, separated list in environment + *variable*. See **remove-path** in the :ref:`modulefile(4)` man page for + further explanation. + Modulefiles ^^^^^^^^^^^ diff --git a/init/bash_completion.in b/init/bash_completion.in index 6cc6a3d8..ddc85c01 100644 --- a/init/bash_completion.in +++ b/init/bash_completion.in @@ -91,14 +91,15 @@ _module() { COMPREPLY=() - cmds="add apropos aliases avail display help\ - initadd initclear initlist initprepend initrm\ - keyword list load path paths purge refresh reload restore\ - rm save savelist saveshow saverm search show source swap\ - switch test unload unuse use whatis" + cmds="add apropos aliases avail append-path display help\ + initadd initclear initlist initprepend initrm keyword\ + list load path paths purge prepend-path refresh reload\ + restore rm remove-path save savelist saveshow saverm search\ + show source swap switch test unload unuse use whatis" opts="-D -h -V --debug --help --version" list_opts="-l -t --long --terse" + path_opts="-d --delim" avail_opts="-d -L -l -t --default --latest --long --terse" case "$prev" in @@ -115,6 +116,8 @@ _module() { COMPREPLY=( $(compgen -W "$(_module_avail)" -- "$cur") );; -h|--help|-V|--version|aliases|apropos|keyword|purge|refresh|reload|search|source) ;; + append-path|prepend-path|remove-path) + COMPREPLY=( $(compgen -W "$path_opts" -- "$cur") );; initadd|initclear|initlist|initprepend|initrm) ;; *) if test $COMP_CWORD -gt 2 diff --git a/init/fish_completion b/init/fish_completion index 9053e341..a89307f9 100644 --- a/init/fish_completion +++ b/init/fish_completion @@ -2,7 +2,7 @@ function __fish_module_no_subcommand --description 'Test if modulecmd has yet to be given the subcommand' for i in (commandline -opc) - if contains -- $i add load rm unload swap switch show display list avail aliases use unuse refresh reload purge source whatis apropos keyword search test save restore saverm saveshow savelist initadd initprepend initrm initswitch initlist initclear path paths + if contains -- $i add load rm unload swap switch show display list avail aliases use unuse refresh reload purge source whatis apropos keyword search test save restore saverm saveshow savelist initadd initprepend initrm initswitch initlist initclear path paths append-path prepend-path remove-path return 1 end end @@ -92,6 +92,9 @@ complete -f -n '__fish_module_no_subcommand' -c module -a 'initlist' --descripti complete -f -n '__fish_module_no_subcommand' -c module -a 'initclear' --description 'Clear all modulefiles from init file' complete -f -n '__fish_module_no_subcommand' -c module -a 'path' --description 'Print modulefile path' complete -f -n '__fish_module_no_subcommand' -c module -a 'paths' --description 'Print path of matching available modules' +complete -f -n '__fish_module_no_subcommand' -c module -a 'append-path' --description 'Append value to environment variable' +complete -f -n '__fish_module_no_subcommand' -c module -a 'prepend-path' --description 'Prepend value to environment variable' +complete -f -n '__fish_module_no_subcommand' -c module -a 'remove-path' --description 'Remove value from environment variable' complete -c module -s V -l version --description 'Module version' complete -c module -s D -l debug --description 'Enable debug messages' diff --git a/init/tcsh_completion.in b/init/tcsh_completion.in index d5c60b3e..e1d26427 100644 --- a/init/tcsh_completion.in +++ b/init/tcsh_completion.in @@ -38,11 +38,12 @@ alias _module_not_yet_loaded '\\ alias _module_modulepath 'echo ${MODULEPATH} | sed '"'"'s/:/\n/g;'"'"' ' -set module_cmds = "add apropos aliases avail display help initadd initclear initlist initprepend initrm keyword list load path paths purge refresh reload restore rm save savelist saveshow saverm search show source swap switch test unload unuse use whatis" +set module_cmds = "add apropos aliases avail append-path display help initadd initclear initlist initprepend initrm keyword list load path paths purge prepend-path refresh reload restore rm remove-path save savelist saveshow saverm search show source swap switch test unload unuse use whatis" set module_opts = "-D -h -V --debug --help --version" set module_list_opts = "-l -t --long --terse" set module_avail_opts = "-d -L -l -t --default --latest --long --terse" +set module_path_opts = "-d --delim" complete module 'n/help/`_module_avail`/' \ 'n/add/`_module_not_yet_loaded`/' \ @@ -81,6 +82,9 @@ complete module 'n/help/`_module_avail`/' \ 'n/initrm/n/' \ 'n/initlist/n/' \ 'n/initclear/n/' \ + "n/append-path/(${module_path_opts})/" \ + "n/prepend-path/(${module_path_opts})/" \ + "n/remove-path/(${module_path_opts})/" \ 'n/-h/n/' \ 'n/--help/n/' \ 'n/-V/n/' \ diff --git a/init/zsh-functions/_module b/init/zsh-functions/_module index 9b72b27e..62f86948 100644 --- a/init/zsh-functions/_module +++ b/init/zsh-functions/_module @@ -114,6 +114,9 @@ _module() { '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' ) # show commands only with compatible options if (( !$+opt_args[-h] && !$+opt_args[--help] \ @@ -172,6 +175,11 @@ _module() { _alternative 'avail-mods:modulefiles:{_module_avail_mods}' \ && ret=0 ;; + (append-path|prepend-path|remove-path) + _arguments \ + '(-d --delim)'{-d,--delim}'[Path element separator]' \ + && ret=0 + ;; esac ;; esac diff --git a/modulecmd.tcl.in b/modulecmd.tcl.in index 6ccd764c..352019cf 100755 --- a/modulecmd.tcl.in +++ b/modulecmd.tcl.in @@ -1472,6 +1472,19 @@ proc module {command args} { popCommandName } } + {^(prepend|append|remove)-path$} { + if {$topcall} { + if {[llength $args] < 2 || [llength $args] > 4} { + set errormsg "Unexpected number of args for '$command' command" + } else { + eval cmdModuleResurface $command $args + } + } else { + # no call other than from top level to to conflict with modulefile + # specific Tcl commands + set errormsg "${msgprefix}Command '$command' not supported" + } + } . { set errormsg "${msgprefix}Invalid command '$command'" } @@ -5451,12 +5464,15 @@ proc cmdModuleInit {args} { } } -proc cmdModuleImm {args} { +# provide access to modulefile specific commands from the command-line, making +# them standing as a module sub-command (see module procedure) +proc cmdModuleResurface {cmd args} { + reportDebug "cmdModuleResurface: cmd='$cmd', args='$args'" + pushMode "load" - - #puts stderr $args - eval $args - + pushCommandName $cmd + eval $cmd $args + popCommandName popMode } @@ -5542,11 +5558,11 @@ Shell's initialization files handling commands: initswitch mod1 mod2 Switch mod1 with mod2 from init file initclear Clear all modulefiles from init file -Module commands available from the command line: - prepend-path VAR PATH [separator] - append-path VAR PATH [separator] - remove-path VAR PATH [separator] - Path-like variable manipulation +Environment direct handling commands: + prepend-path [-d c] var value Prepend value to environment variable + append-path [-d c] var value Append value to environment variable + remove-path [-d c] var value Remove value from environment variable + Other commands: help [modulefile ...] Print this or modulefile(s) help info display | show modulefile [...] Display information about modulefile(s) @@ -5610,6 +5626,7 @@ if {[catch { # extract options and command switches from other args set otherargv {} + set ddelimarg 0 foreach arg [lrange $argv 1 end] { if {[info exists ignore_next_arg]} { unset ignore_next_arg @@ -5639,15 +5656,26 @@ if {[catch { set show_oneperline 0 } {-d} - {--default} { - set show_filter "onlydefaults" + # in case of *-path command, -d means --delim + if {$arg eq "-d" && $ddelimarg} { + lappend otherargv $arg + } else { + set show_filter "onlydefaults" + } } {-L} - {--latest} { set show_filter "onlylatest" } - {-a} - {--append} - {-append} - {-p} - {--prepend} - {-prepend} { + {-a} - {--append} - {-append} - {-p} - {--prepend} - {-prepend} \ + - {--delim} - {-delim} - {--delim=*} - {-delim=*} { # command-specific switches interpreted later on lappend otherargv $arg } + {append-path} - {prepend-path} - {remove-path} { + # detect *-path commands to say -d means --delim, not --default + set ddelimarg 1 + lappend otherargv $arg + } {-f} - {--force} - {--human} - {-v} - {--verbose} - {-s} -\ {--silent} - {-c} - {--create} - {-i} - {--icase} -\ {--userlvl=*} { @@ -5732,16 +5760,8 @@ if {[catch { # defined in env(MODULESPATH) runModulerc - switch -regexp -- $command { - {^(prepend|append|remove)-path$} { - eval cmdModuleImm $command $otherargv - renderSettings - } - . { - # eval needed to pass otherargv as list to module proc - eval module $command $otherargv - } - } + # eval needed to pass otherargv as list to module proc + eval module $command $otherargv } errMsg ]} { # no use of reportError here to get independent from any # previous error report inhibition