--- a/init/zsh-functions/_module +++ a/init/zsh-functions/_module @@ -4,17 +4,35 @@ # Zsh command-line completion for module # Copyright (C) 2017 Xavier Delaruelle # +# patched version: +# - directory-wise completion +# -_module_avail() { - module avail -t 2>&1 | sed ' - /^-\+/d; /^\s*$/d; - /->.*$/d; - /:$/d; - /:ERROR:/d; - s#^\(.*\)/\(.\+\)(.*default.*)#\1\n\1\/\2#; - s#(.*)$##g; - s#\s*$##g; - s#/*$##g;' +function _module_completion () { + emulate -L zsh + local _module_path_prefix + local -a _module_search_path _module_type_d _module_type_f + _module_path_prefix=$(echo ${(q)words[$CURRENT]} | sed -ne 's#\(.*/\).*#\1#p') + _module_search_paths=(${^${(@s/:/)MODULEPATH}}/$_module_path_prefix) + + _module_type_d=() + _module_type_f=() + eval $(find $_module_search_paths -mindepth 1 -maxdepth 1 -not -name '.modulerc' -not -name '.version' -printf "_module_type_%Y+=${(q)_module_path_prefix}%P\n" 2> /dev/null) + + case "$@" in + dir) + compadd ${_module_type_d} + ;; + notloaded) + local -a _modules_loaded=(${=LOADEDMODULES//:/}) + compadd -q -S / ${_module_type_d} + compadd ${_module_type_f:|_modules_loaded} + ;; + *) + compadd -q -S / ${_module_type_d} + compadd ${_module_type_f} + ;; + esac } _module_savelist() { @@ -24,16 +42,13 @@ _module_savelist() { /:ERROR:/d;' } -_module_not_yet_loaded() { - _module_avail | sort | sed -E "\%^(${LOADEDMODULES//:/|})$%d" -} +_module_all_mods() { + _module_completion + } _module_avail_mods() { - local -a avail_mods; - avail_mods=(${$(_module_avail)}) - - _describe -t avail-mods 'available modulefiles' avail_mods && ret=0 + _module_completion dir } _module_saved_colls() { @@ -44,10 +59,8 @@ _module_saved_colls() { } _module_notloaded_mods() { - local -a not_yet_loaded_mods; - not_yet_loaded_mods=(${$(_module_not_yet_loaded)}) + _module_completion notloaded - _describe -t avail-mods 'available modulefiles' not_yet_loaded_mods && ret=0 } _module_loaded_mods() { @@ -177,7 +190,7 @@ _module() { '*:modulepath:_files -/' && ret=0 ;; (display|help|show|test|whatis|is-loaded|is-avail|info-loaded) - _alternative 'avail-mods:modulefiles:{_module_avail_mods}' \ + _alternative 'avail-mods:modulefiles:{_module_all_mods}' \ && ret=0 ;; (append-path|prepend-path)