diff options
Diffstat (limited to 'completions/update-alternatives')
-rw-r--r-- | completions/update-alternatives | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/completions/update-alternatives b/completions/update-alternatives new file mode 100644 index 0000000..25d2ce6 --- /dev/null +++ b/completions/update-alternatives @@ -0,0 +1,92 @@ +# bash completion for update-alternatives -*- shell-script -*- + +_installed_alternatives() +{ + local admindir + # find the admin dir + for i in alternatives dpkg/alternatives rpm/alternatives; do + [[ -d /var/lib/$i ]] && admindir=/var/lib/$i && break + done + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == --admindir ]]; then + admindir=${words[i + 1]} + break + fi + done + COMPREPLY=($(compgen -W '$(command ls $admindir)' -- "$cur")) +} + +_update_alternatives() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --altdir | --admindir) + _filedir -d + return + ;; + --help | --usage | --version) + return + ;; + esac + + local mode args i + + # find which mode to use and how many real args used so far + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == --@(install|remove|auto|display|config|remove-all|set) ]]; then + mode=${words[i]} + args=$((cword - i)) + break + fi + done + + case ${mode-} in + --install) + case $args in + 1 | 3) + _filedir + ;; + 2) + _installed_alternatives + ;; + 4) + # priority - no completions + ;; + *) + case $((args % 4)) in + 0 | 2) + _filedir + ;; + 1) + COMPREPLY=($(compgen -W '--slave' -- "$cur")) + ;; + 3) + _installed_alternatives + ;; + esac + ;; + esac + ;; + --remove | --set) + case $args in + 1) + _installed_alternatives + ;; + 2) + _filedir + ;; + esac + ;; + --auto | --remove-all | --display | --config) + _installed_alternatives + ;; + *) + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + ;; + esac +} && + complete -F _update_alternatives update-alternatives alternatives + +# ex: filetype=sh |