# shellcheck shell=bash # # Bash commandline completion # _module_comgen_words_and_files() { local k=0 local setnospace=1 # do not append space to word completed if it is a directory (ends with /) for val in $(compgen -W "$1" -- "$2"); do if [ $setnospace -eq 1 ] && [ "${val: -1:1}" = '/' ]; then # Bash >=4.0 is required for compopt type compopt &>/dev/null && compopt -o nospace setnospace=0 fi COMPREPLY[k++]="$val" done } _module_avail() { local cur="${1:-}" # skip avail call if word currently being completed is an option keyword if [ -z "$cur" ] || [ "${cur:0:1}" != '-' ]; then module avail --color=never -s -t -S --no-indepth -o '' "$cur" 2>&1 fi } _module_savelist() { module savelist --color=never -s -t 2>&1 | sed ' /No named collection\.$/d; /Named collection list$/d; /:$/d;' } _module_stashlist() { module stashlist --color=never -s -t 2>&1 | sed ' /No stash collection\.$/d; /Stash collection list$/d; /:$/d;' } _module_not_yet_loaded() { _module_avail "${1:-}" | sort | @SED_ERE@ "\%^(${LOADEDMODULES//:/|})$%d" } _module_long_arg_list() { local cur="$1" i if [[ ${COMP_WORDS[COMP_CWORD-2]} == sw* ]] then _module_comgen_words_and_files "$(_module_not_yet_loaded "$cur")" "$cur" return fi for ((i = COMP_CWORD - 1; i > 0; i--)) do case ${COMP_WORDS[$i]} in add|load) _module_comgen_words_and_files "$(_module_not_yet_loaded "$cur")" "$cur" break;; rm|del|remove|unload|switch|swap) COMPREPLY=( $(IFS=: compgen -W "${LOADEDMODULES}" -- "$cur") ) break;; esac done } _module() { local cur="$2" prev="$3" cmds opts COMPREPLY=() case "$prev" in add|add-any|load|load-any|try-add|try-load) _module_comgen_words_and_files "@comp_load_opts@ $(_module_not_yet_loaded "$cur")" "$cur";; avail) _module_comgen_words_and_files "@comp_avail_opts@ $(_module_avail "$cur")" "$cur";; edit) _module_comgen_words_and_files "$(_module_avail "$cur")" "$cur";; aliases) COMPREPLY=( $(compgen -W "@comp_aliases_opts@" -- "$cur") );; list|savelist) COMPREPLY=( $(compgen -W "@comp_list_opts@" -- "$cur") );; stashlist) COMPREPLY=( $(compgen -W "@comp_stashlist_opts@" -- "$cur") );; stashpop|stashshow|stashrm) COMPREPLY=( $(compgen -W "$(_module_stashlist)" -- "$cur") );; clear) COMPREPLY=( $(compgen -W "@comp_clear_opts@" -- "$cur") );; restore|save|saveshow|saverm|is-saved) COMPREPLY=( $(compgen -W "$(_module_savelist)" -- "$cur") );; rm|del|remove|unload) COMPREPLY=( $(compgen -W "@comp_unload_opts@ ${LOADEDMODULES//:/ }" -- "$cur") );; switch|swap) COMPREPLY=( $(compgen -W "@comp_load_opts@ ${LOADEDMODULES//:/ }" -- "$cur") );; unuse|is-used) COMPREPLY=( $(IFS=: compgen -W "${MODULEPATH}" -- "$cur") );; use|-a|--append|cachebuild) ;; # let readline handle the completion display|help|show|test|path|paths|is-loaded|info-loaded) _module_comgen_words_and_files "@comp_mfile_opts@ $(_module_avail "$cur")" "$cur";; is-avail) _module_comgen_words_and_files "@comp_isavail_opts@ $(_module_avail "$cur")" "$cur";; lint) _module_comgen_words_and_files "@comp_lint_opts@ $(_module_avail "$cur")" "$cur";; mod-to-sh) _module_comgen_words_and_files "@comp_modtosh_opts@ $(_module_not_yet_loaded "$cur")" "$cur";; whatis) _module_comgen_words_and_files "@comp_whatis_opts@ $(_module_avail "$cur")" "$cur";; apropos|keyword|search) COMPREPLY=( $(compgen -W "@comp_search_opts@" -- "$cur") );; config|--reset) COMPREPLY=( $(compgen -W "@comp_config_opts@" -- "$cur") );; -h|--help|-V|--version|purge|refresh|reload|sh-to-mod|source|state|reset|stash|stashclear|cacheclear) ;; append-path|prepend-path) COMPREPLY=( $(compgen -W "@comp_path_opts@" -- "$cur") );; remove-path) COMPREPLY=( $(compgen -W "@comp_rm_path_opts@" -- "$cur") );; initadd|initclear|initlist|initprepend|initrm) ;; *) if test "$COMP_CWORD" -gt 2 then _module_long_arg_list "$cur" else case "$cur" in # The mappings below are optional abbreviations for convenience ls) COMPREPLY=( "list" );; # map ls -> list sw*) COMPREPLY=( "switch" );; -*) COMPREPLY=( $(compgen -W "@comp_opts@" -- "$cur") );; *) COMPREPLY=( $(compgen -W "@comp_opts@ @comp_cmds@" -- "$cur") );; esac fi;; esac } # define completion for ml command if command exists if $(type -t ml >/dev/null); then _ml() { local cur="$2" prev="$3" cmds opts COMPREPLY=() case "$prev" in add|add-any|load|load-any|try-add|try-load) _module_comgen_words_and_files "@comp_load_opts@ $(_module_not_yet_loaded "$cur")" "$cur";; avail) _module_comgen_words_and_files "@comp_avail_opts@ $(_module_avail "$cur")" "$cur";; edit) _module_comgen_words_and_files "$(_module_avail "$cur")" "$cur";; aliases) COMPREPLY=( $(compgen -W "@comp_aliases_opts@" -- "$cur") );; list|savelist) COMPREPLY=( $(compgen -W "@comp_list_opts@" -- "$cur") );; stashlist) COMPREPLY=( $(compgen -W "@comp_stashlist_opts@" -- "$cur") );; stashpop|stashshow|stashrm) COMPREPLY=( $(compgen -W "$(_module_stashlist)" -- "$cur") );; clear) COMPREPLY=( $(compgen -W "@comp_clear_opts@" -- "$cur") );; restore|save|saveshow|saverm|is-saved) COMPREPLY=( $(compgen -W "$(_module_savelist)" -- "$cur") );; rm|del|remove|unload) COMPREPLY=( $(compgen -W "@comp_unload_opts@ ${LOADEDMODULES//:/ }" -- "$cur") );; switch|swap) COMPREPLY=( $(compgen -W "@comp_load_opts@ ${LOADEDMODULES//:/ }" -- "$cur") );; unuse|is-used) COMPREPLY=( $(IFS=: compgen -W "${MODULEPATH}" -- "$cur") );; use|-a|--append|cachebuild) ;; # let readline handle the completion display|help|show|test|path|paths|is-loaded|info-loaded) _module_comgen_words_and_files "@comp_mfile_opts@ $(_module_avail "$cur")" "$cur";; is-avail) _module_comgen_words_and_files "@comp_isavail_opts@ $(_module_avail "$cur")" "$cur";; lint) _module_comgen_words_and_files "@comp_lint_opts@ $(_module_avail "$cur")" "$cur";; mod-to-sh) _module_comgen_words_and_files "@comp_modtosh_opts@ $(_module_not_yet_loaded "$cur")" "$cur";; whatis) _module_comgen_words_and_files "@comp_whatis_opts@ $(_module_avail "$cur")" "$cur";; apropos|keyword|search) COMPREPLY=( $(compgen -W "@comp_search_opts@" -- "$cur") );; config|--reset) COMPREPLY=( $(compgen -W "@comp_config_opts@" -- "$cur") );; -h|--help|-V|--version|purge|refresh|reload|sh-to-mod|source|state|reset|stash|stashclear|cacheclear) ;; append-path|prepend-path) COMPREPLY=( $(compgen -W "@comp_path_opts@" -- "$cur") );; remove-path) COMPREPLY=( $(compgen -W "@comp_rm_path_opts@" -- "$cur") );; initadd|initclear|initlist|initprepend|initrm) ;; *) if test "$COMP_CWORD" -gt 2 then _module_long_arg_list "$cur" else case "$cur" in # The mappings below are optional abbreviations for convenience ls) COMPREPLY=( "list" );; # map ls -> list sw*) COMPREPLY=( "switch" );; -*) COMPREPLY=( $(compgen -W "@comp_opts@" -- "$cur") ) loaded_modules="" for i in ${LOADEDMODULES//:/ }; do loaded_modules+="-${i} " done COMPREPLY=( "${COMPREPLY[@]}" $(compgen -W "@comp_load_opts@ $loaded_modules" -- "$cur") );; *) _module_comgen_words_and_files "@comp_load_opts@ $(_module_not_yet_loaded "$cur")" "$cur" COMPREPLY=( "${COMPREPLY[@]}" $(compgen -W "@comp_opts@ @comp_cmds@" -- "$cur") ) loaded_modules="" for i in ${LOADEDMODULES//:/ }; do loaded_modules+="-${i} " done COMPREPLY=( "${COMPREPLY[@]}" $(compgen -W "@comp_load_opts@ $loaded_modules" -- "$cur") );; esac fi;; esac } complete -o default -F _ml ml fi complete -o default -F _module module