# bash completion for update-alternatives have update-alternatives && { _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 < COMP_CWORD; i++ )); do if [[ "${COMP_WORDS[i]}" == --admindir ]]; then admindir=${COMP_WORDS[i+1]} break fi done COMPREPLY=( $( compgen -W '$( command ls $admindir )' -- "$cur" ) ) } _update_alternatives() { local cur prev mode args i COMPREPLY=() _get_comp_words_by_ref cur prev case $prev in --altdir|--admindir) _filedir -d return 0 ;; --help|--usage|--version) return 0 ;; esac # find which mode to use and how many real args used so far for (( i=1; i < COMP_CWORD; i++ )); do if [[ "${COMP_WORDS[i]}" == --@(install|remove|auto|display|config|remove-all|set) ]]; then mode=${COMP_WORDS[i]} args=$(($COMP_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 } # Local variables: # mode: shell-script # sh-basic-offset: 4 # sh-indent-comment: t # indent-tabs-mode: nil # End: # ex: ts=4 sw=4 et filetype=sh