# This function is required by _dpkg() and _dpkg-reconfigure() have dpkg && { have grep-status && { _comp_dpkg_installed_packages() { grep-status -P -e "^$1" -a -FStatus 'install ok installed' -n -s Package } } || { _comp_dpkg_installed_packages() { command grep -A 1 "Package: $1" /var/lib/dpkg/status | \ command grep -B 1 -Ee "ok installed|half-installed|unpacked| \ half-configured|config-files" \ -Ee "^Essential: yes" | \ command grep "Package: $1" | cut -d\ -f2 } } # Debian dpkg(8) completion # _dpkg() { local cur prev i COMPREPLY=() _get_comp_words_by_ref cur prev i=$COMP_CWORD _expand || return 0 _split_longopt # find the last option flag if [[ $cur != -* ]]; then while [[ $prev != -* && $i != 1 ]]; do i=$((i-1)) prev=${COMP_WORDS[i-1]} done fi case $prev in -c|-i|-A|-I|-f|-e|-x|-X|-W|--install|--unpack|--record-avail| \ --contents|--info|--fsys-tarfile|--field|--control|--extract| \ --show) _filedir '?(u)deb' return 0 ;; -b|--build) _filedir -d return 0 ;; -s|-p|-l|--status|--print-avail|--list) COMPREPLY=( $( apt-cache pkgnames "$cur" 2>/dev/null ) ) return 0 ;; -S|--search) _filedir return 0 ;; -r|-L|-P|--remove|--purge|--listfiles) COMPREPLY=( $( _comp_dpkg_installed_packages "$cur" ) ) return 0 ;; *) COMPREPLY=( $( compgen -W '-i --install --unpack -A --record-avail \ --configure -r --remove -P --purge --get-selections \ --set-selections --update-avail --merge-avail \ --clear-avail --command-fd --forget-old-unavail -s \ --status -p --print-avail -L --listfiles -l --list \ -S --search -C --audit --print-architecture \ --print-gnu-build-architecture \ --print-installation-architecture \ --compare-versions --help --version --force-help \ --force-all --force-auto-select --force-downgrade \ --force-configure-any --force-hold --force-bad-path \ --force-not-root --force-overwrite \ --force-overwrite-diverted --force-bad-verify \ --force-depends-version --force-depends \ --force-confnew --force-confold --force-confdef \ --force-confmiss --force-conflicts --force-architecture\ --force-overwrite-dir --force-remove-reinstreq \ --force-remove-essential -Dh \ --debug=help --licence --admindir --root --instdir \ -O --selected-only -E --skip-same-version \ -G --refuse-downgrade -B --auto-deconfigure \ --no-debsig --no-act -D --debug --status-fd \ -b --build -I --info -f --field -c --contents \ -x --extract -X --vextract --fsys-tarfile -e --control \ --ignore-depends --abort-after' -- "$cur" ) ) ;; esac } complete -F _dpkg dpkg dpkg-deb } # Debian GNU dpkg-reconfigure(8) completion # have dpkg-reconfigure && _dpkg_reconfigure() { local cur prev opt COMPREPLY=() _get_comp_words_by_ref cur prev case $prev in -f|--frontend) opt=( $( printf '%s\n' /usr/share/perl5/Debconf/FrontEnd/* ) ) opt=( ${opt[@]##*/} ) opt=( ${opt[@]%.pm} ) COMPREPLY=( $( compgen -W '${opt[@]}' -- "$cur" ) ) return 0 ;; -p|--priority) COMPREPLY=( $( compgen -W 'low medium high critical' -- "$cur" ) ) return 0 ;; esac if [[ "$cur" == -* ]]; then COMPREPLY=( $(compgen -W '--frontend --priority --all --unseen-only \ --help --showold --force --terse' -- "$cur" ) ) else COMPREPLY=( $( _comp_dpkg_installed_packages "$cur" ) ) fi } && complete -F _dpkg_reconfigure -o default dpkg-reconfigure # Debian dpkg-source completion # have dpkg-source && _dpkg_source() { local cur prev options work i action packopts unpackopts fields packopts="-c -l -F -V -T -D -U -W -E -sa -i -I -sk -sr -ss -sA -sK -sP \ -sU -sR" unpackopts="-sp -sn -su" options="-x -b $packopts $unpackopts" fields="Format Source Version Binary Maintainer Uploader Architecture \ Standards-Version Build-Depends Files" COMPREPLY=() _get_comp_words_by_ref cur prev action="options" for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do if [[ ${COMP_WORDS[$i]} == "-x" ]]; then action=unpack elif [[ ${COMP_WORDS[$i]} == "-b" ]]; then action=pack elif [[ ${COMP_WORDS[$i]} == "-h" ]]; then action=help fi done case $action in unpack) case $prev in -x) _filedir -d _filedir 'dsc' return 0 ;; *) COMPREPLY=( $( compgen -W "$unpackopts" -- "$cur" ) ) _filedir -d _filedir return 0 ;; esac return 0 ;; pack) case $prev in -b) _filedir -d return 0 ;; -c|-l|-T|-i|-I) # -c: get controlfile # -l: get per-version info from this file # -T: read variables here, not debian/substvars # -i: filter out files to ignore diffs of. # -I: filter out files when building tarballs. # return directory names and file names _filedir -d _filedir return 0 ;; -F) # -F: force change log format COMPREPLY=( $( command ls /usr/lib/dpkg/parsechangelog ) ) return 0 ;; -V|-D) # -V: set a substitution variable # we don't know anything about possible variables or values # so we don't try to suggest any completion. COMPREPLY=() return 0 ;; -D) # -D: override or add a .dsc field and value # if $cur doesn't contain a = yet, suggest variable names if [[ "$cur" == *=* ]]; then # $cur contains a "=" COMPREPLY=() return 0 else COMPREPLY=( $( compgen -W "$fields" -- "$cur" ) ) return 0 fi ;; -U) # -U: remove a field # Suggest possible fieldnames COMPREPLY=( $( compgen -W "$fields" -- "$cur" ) ) return 0 ;; *) COMPREPLY=( $( compgen -W "$packopts $unpackopts" -- "$cur" ) ) return 0 ;; esac return 0 ;; *) COMPREPLY=( $( compgen -W "$options" -- "$cur" ) ) return 0 ;; esac } && complete -F _dpkg_source dpkg-source # 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