# 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