# 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 0 ;; --help|--usage|--version) return 0 ;; 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 '--verbose --quiet --help --version --altdir --admindir --install --remove --auto --display --config --set' -- "$cur" ) ) esac } && complete -F _update_alternatives update-alternatives alternatives # ex: ts=4 sw=4 et filetype=sh