# This function is required by _dpkg() and _dpkg-reconfigure() _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 words cword split _init_completion -s || return _expand || return 0 local i=$cword # find the last option flag if [[ $cur != -* ]]; then while [[ $prev != -* && $i -ne 1 ]]; do i=$((i-1)) prev=${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 ;; esac $split && return COMPREPLY=( $( compgen -W '$( _parse_help "$1" )' -- "$cur" ) ) [[ $COMPREPLY == *= ]] && compopt -o nospace } && complete -F _dpkg dpkg dpkg-deb # Debian GNU dpkg-reconfigure(8) completion # _dpkg_reconfigure() { local cur prev words cword _init_completion || return local opt 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 # _dpkg_source() { local cur prev words cword _init_completion || return local 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" action="options" for (( i=0; i < ${#words[@]}-1; i++ )); do if [[ ${words[$i]} == "-x" ]]; then action=unpack elif [[ ${words[$i]} == "-b" ]]; then action=pack elif [[ ${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