diff options
Diffstat (limited to 'completions/modprobe')
-rw-r--r-- | completions/modprobe | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/completions/modprobe b/completions/modprobe new file mode 100644 index 0000000..36cb588 --- /dev/null +++ b/completions/modprobe @@ -0,0 +1,123 @@ +# Linux modprobe(8) completion -*- shell-script -*- + +_modprobe() +{ + local cur prev words cword split + _init_completion -s || return + + case "$prev" in + --help | --version | -!(-*)[hV]) + return + ;; + --config | -!(-*)C) + _filedir + return + ;; + --dirname | --type | -!(-*)[dt]) + _filedir -d + return + ;; + --set-version | -!(-*)S) + _kernel_versions + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + if [[ ! ${COMPREPLY-} ]]; then + COMPREPLY=($(compgen -W '-a --all -b --use-blacklist -C --config + -c --showconfig --dump-modversions -d --dirname --first-time + --force-vermagic --force-modversion -f --force -i + --ignore-install --ignore-remove -l --list -n --dry-run -q + --quiet -R --resolve-alias -r --remove -S --set-version + --show-depends -s --syslog -t --type -V --version -v + --verbose' -- "$cur")) + fi + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + local i mode=insert module="" version=$(uname -r) + for ((i = 1; i < cword; i++)); do + case "${words[i]}" in + --remove | -!(-*)r*) + mode=remove + ;; + --list | -!(-*)l*) + mode=list + ;; + --dump-modversions) + mode="file" + ;; + --set-version | -!(-*)S) + version=${words[i + 1]} # -S is not $prev and not $cur + ;; + --config | --dirname | --type | -!(-*)[Cdt]) + ((i++)) # skip option and its argument + ;; + -*) + # skip all other options + ;; + *) + [[ -z $module ]] && module=${words[i]} + ;; + esac + done + + case $mode in + remove) + _installed_modules "$cur" + ;; + list) + # no completion available + ;; + file) + _filedir + ;; + insert) + # do filename completion if we're giving a path to a module + if [[ $cur == @(*/|[.~])* ]]; then + _filedir '@(?(k)o?(.[gx]z))' + elif [[ -n $module ]]; then + # do module parameter completion + if [[ $cur == *=* ]]; then + prev=${cur%%=*} + cur=${cur#*=} + if PATH="$PATH:/sbin" modinfo -p "$module" 2>/dev/null | + command grep -q "^$prev:.*(bool)"; then + local choices="on off" + [[ $cur ]] && choices="1 0 y Y n N on off" + COMPREPLY=($(compgen -W "$choices" -- "$cur")) + fi + else + COMPREPLY=($(compgen -S = -W "$(PATH="$PATH:/sbin" \ + modinfo -p "$module" 2>/dev/null | + awk -F: '!/^[ \t]/ { print $1 }')" -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi + else + _modules $version + if [[ ${COMPREPLY-} ]]; then + # filter out already installed modules + local -a mods=("${COMPREPLY[@]}") + _installed_modules "$cur" + for i in "${!mods[@]}"; do + for module in "${COMPREPLY[@]}"; do + if [[ ${mods[i]} == "$module" ]]; then + unset 'mods[i]' + break + fi + done + done + COMPREPLY=("${mods[@]}") + fi + fi + ;; + esac +} && + complete -F _modprobe modprobe + +# ex: filetype=sh |