diff options
Diffstat (limited to 'contrib/bash_completion')
-rw-r--r-- | contrib/bash_completion | 434 |
1 files changed, 86 insertions, 348 deletions
diff --git a/contrib/bash_completion b/contrib/bash_completion index f0b5f9cc..2713ba4d 100644 --- a/contrib/bash_completion +++ b/contrib/bash_completion @@ -1,370 +1,108 @@ -# vim: set ft=sh ts=2 sw=2 et: -# file: /etc/bash_completion.d/pacman - -# Bash completion for pacman -# Original: Manolis Tzanidakis <mtzanidakis@freemail.gr> -# -# Distributed under the terms of the GNU General Public License, v2 or later. -# - -## initial functions - -rem_selected () -{ - # (Adapted from bash_completion by Ian Macdonald <ian@caliban.org>) - # This removes any options from the list of completions that have - # already been specified on the command line. - COMPREPLY=($(\echo "${COMP_WORDS[@]}" | \ - (while read -d ' ' i; do - [ "${i}" == "" ] && continue - # flatten array with spaces on either side, - # otherwise we cannot grep on word boundaries of - # first and last word - COMPREPLY=" ${COMPREPLY[@]} " - # remove word from list of completions - COMPREPLY=(${COMPREPLY/ ${i%% *} / }) +# This file is in the public domain. + +_arch_compgen() { + local i r + COMPREPLY=($(compgen -W '$*' -- "$cur")) + for ((i=1; i < ${#COMP_WORDS[@]}-1; i++)); do + for r in ${!COMPREPLY[@]}; do + if [[ ${COMP_WORDS[i]} = ${COMPREPLY[r]} ]]; then + unset 'COMPREPLY[r]'; break + fi done - \echo ${COMPREPLY[@]}))) - return 0 -} - -_available_repos () -{ - COMPREPLY=( $( compgen -W "$(\grep '\[' /etc/pacman.conf | \grep -v -e 'options' -e '^#' | \tr -d '[]' )" -- $cur ) ) -} - -_installed_pkgs () -{ - local installed_pkgs - installed_pkgs=$( \ls /var/lib/pacman/local/ ) - COMPREPLY=( $( compgen -W "$( for i in $installed_pkgs; do \echo ${i%-*-*}; done )" -- $cur ) ) -} - -_available_pkgs () -{ - #find balks easilly on a find /foo/*/* type dir, especially one like - # /var/lib/pacman/*/* - # This little change-up removes the find *and* only uses enabled repos - local available_pkgs - local enabled_repos - enabled_repos=$( \grep '\[' /etc/pacman.conf | \grep -v -e 'options' -e '^#' | \tr -d '[]' ) - available_pkgs=$( for r in $enabled_repos; do \echo /var/lib/pacman/sync/$r/*; done ) - COMPREPLY=( $( compgen -W "$( for i in $available_pkgs; do j=${i##*/}; echo ${j%-*-*}; done )" -- $cur ) ) + done } -_installed_groups () -{ - local installed_groups - installed_groups=$( \find /var/lib/pacman/local -name desc -exec \sed -ne '/%GROUPS%/,/^$/{//d; p}' {} \; | \sort -u ) - COMPREPLY=( $( compgen -W "$( for i in $installed_groups; do \echo ${i%-*-*}; done )" -- $cur ) ) +_arch_ptr2comp() { + local list= x y + for x; do + for y in '0 --' '1 -'; do + eval 'set -- ${'$x'[${y% *}]}' + list+=\ ${@/#/${y#* }} + done + done + _arch_compgen $list } -_available_groups () -{ - #find balks easilly on a find /foo/*/* type dir, especially one like - # /var/lib/pacman/*/* - # This little change-up removes the find *and* only uses enabled repos - local available_groups - local enabled_repos - enabled_repos=$( \grep '\[' /etc/pacman.conf | \grep -v -e 'options' -e '^#' | tr -d '[]' ) - available_groups=$( for r in $enabled_repos; do \sed '/%GROUPS%/,/^$/{//d; p}' /var/lib/pacman/sync/$r/*/desc | \sort -u; done ) - COMPREPLY=( $( compgen -W "$( for i in $available_groups; do \echo ${i%-*-*}; done )" -- $cur ) ) +_arch_incomp() { + local r="\s-(-${1#* }\s|\w*${1% *})"; [[ $COMP_LINE =~ $r ]] } -## makepkg completion - -_makepkg () -{ - local cur prev +_makepkg() { + local cur opts prev COMPREPLY=() - cur=${COMP_WORDS[COMP_CWORD]} + cur=$(_get_cword) prev=${COMP_WORDS[COMP_CWORD-1]} - - case "$prev" in - -p) - _filedir - return 0 - ;; - --help|--cleancache) - COMPREPLY='' - return 0 - ;; - esac - - if [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '\ - -A --ignorearch \ - -b --builddeps \ - -c --clean \ - -C --cleancache \ - -d --nodeps \ - -e --noextract \ - -f --force \ - -g --geninteg \ - -h --help \ - -i --install \ - -L --log \ - -m --nocolor \ - -o --nobuild \ - -p \ - -r --rmdeps \ - -s --syncdeps \ - --asroot \ - --source \ - --noconfirm \ - --noprogressbar' -- $cur ) ) + if [[ $cur = -* && ! $prev =~ ^-(-(cleancache|config|help)$|\w*[Chp]) ]]; then + opts=('allsource asroot clean cleancache config force geninteg help holdver + ignorearch install log nobuild nocolor noconfirm nodeps noextract + noprogressbar pkg repackage rmdeps skipinteg source syncdeps' + 'A C L R c d e f g h i m o p r s') + _arch_ptr2comp opts fi - - rem_selected + true } -complete -o default -F _makepkg makepkg -## pacman completion - -_instring () -{ - str="${1}" - shift 1 - for c in "${@}"; do - if [ $(\expr index "${str}" "${c}") -gt 0 ]; then - return 0 +_pacman_pkg() { + _arch_compgen "$( + if [[ $2 ]]; then + \pacman -$1 | \cut -d' ' -f1 | \sort -u + else + \pacman -$1 fi - done - return 1 + )" } -_pacman () -{ - local a arg toparse op mod cur - COMPREPLY=() - - # This argument parsing is done so we can check for flag existance later - # right now it's a tad crappy, but does the job - for (( i=1; i < ${#COMP_WORDS[@]}-1; i++ )); do - a=${COMP_WORDS[i]} - arg="${a:0:2}" - toparse="${a:2}" - - case "${arg}" in - -@(U|R|S|Q|h|V)) - op="${arg/-}" - mod="${mod}${a:2}" - ;; - --) - arg="${a:2}" - case "${arg}" in - remove) op="R" ;; - upgrade) op="U" ;; - query) op="Q" ;; - sync) op="S" ;; - help) op="h" ;; - version) op="V" ;; - verbose) mod="${mod}v" ;; - root) mod="${mod}r" ;; - dbpath) mod="${mod}b" ;; - nodeps) mod="${mod}d" ;; - force) mod="${mod}f" ;; - groups) mod="${mod}g" ;; - info) mod="${mod}i" ;; - list) mod="${mod}l" ;; - print) mod="${mod}p" ;; - search) mod="${mod}s" ;; - sysupgrade) mod="${mod}u" ;; - upgrades) mod="${mod}u" ;; - downloadonly) mod="${mod}w" ;; - refresh) mod="${mod}y" ;; - changelog) mod="${mod}c" ;; - deps) mod="${mod}d" ;; - explicit) mod="${mod}e" ;; - unrequired) mod="${mod}t" ;; - foreign) mod="${mod}m" ;; - owns) mod="${mod}o" ;; - file) mod="${mod}p" ;; - search) mod="${mod}s" ;; - upgrades) mod="${mod}u" ;; - cascade) mod="${mod}c" ;; - check) mod="${mod}k" ;; - dbonly) mod="${mod}k" ;; - nosave) mod="${mod}n" ;; - recursive) mod="${mod}s" ;; - unneeded) mod="${mod}u" ;; - esac ;; - *) toparse="${a}" ;; - esac +_pacman_file() { + compopt -o filenames; _filedir 'pkg.tar.*' +} - arglen=$(( ${#toparse}-1 )) - for c in $(\seq 0 "${arglen}"); do - arg=${toparse:$c:1} - [ "${arg}" != "-" ] && mod="${mod}${arg}" - done +_pacman() { + local common core cur database prev query remove sync upgrade o + COMPREPLY=() + cur=$(_get_cword) + prev=${COMP_WORDS[COMP_CWORD-1]} + database=('asdeps asexplicit') + query=('changelog check deps explicit file foreign groups info list owns + search unrequired upgrades' 'c e g i k l m o p s t u') + remove=('cascade dbonly nodeps nosave print recursive unneeded' 'c k n p s u') + sync=('asdeps asexplicit clean downloadonly force groups ignore ignoregroup + info list needed nodeps print refresh search sysupgrade' + 'c f g i l p s u w y') + upgrade=('asdeps asexplicit force nodeps print' 'f p') + common=('arch cachedir config dbpath debug help logfile noconfirm + noprogressbar noscriptlet quiet root verbose' 'b d h q r v') + core=('database help query remove sync upgrade version' 'D Q R S U V h') + + for o in 'D database' 'Q query' 'R remove' 'S sync' 'U upgrade'; do + _arch_incomp "$o" && break done - cur=${COMP_WORDS[COMP_CWORD]} - - if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then - COMPREPLY=( $( compgen -W '\ - -h --help \ - -Q --query \ - -R --remove \ - -S --sync \ - -U --upgrade \ - -V --version \ - ' -- $cur ) ) - rem_selected - return 0 - fi - - if [[ "$cur" == -* ]]; then - case "${op}" in - U) - COMPREPLY=( $( compgen -W '\ - --asdeps \ - --asexplicit \ - -d --nodeps \ - -f --force \ - -h --help \ - --config \ - --logfile \ - --noconfirm \ - --noprogressbar \ - --noscriptlet \ - -v --verbose \ - -r --root \ - -b --dbpath \ - -p --print \ - --print-format \ - --cachedir \ - ' -- $cur ) ) - return 0 - ;; - R) - COMPREPLY=( $( compgen -W '\ - -c --cascade \ - -d --nodeps \ - -h --help \ - -k --dbonly \ - -n --nosave \ - -s --recursive \ - -u --unneeded \ - --config \ - --logfile \ - --noconfirm \ - --noprogressbar \ - --noscriptlet \ - -v --verbose \ - -r --root \ - -b --dbpath \ - -p --print \ - --print-format \ - --cachedir \ - ' -- $cur ) ) - return 0 - ;; - S) - COMPREPLY=( $( compgen -W '\ - --asdeps \ - --asexplicit \ - -c --clean \ - -d --nodeps \ - -f --force \ - -g --groups \ - -h --help \ - -i --info \ - -l --list \ - -s --search \ - -u --sysupgrade \ - -w --downloadonly \ - -y --refresh \ - --needed \ - --ignore \ - --ignoregroup \ - --config \ - --logfile \ - --noconfirm \ - --noprogressbar \ - --noscriptlet \ - -v --verbose \ - -r --root \ - -b --dbpath \ - -p --print \ - --print-format \ - --cachedir \ - ' -- $cur ) ) - return 0 - ;; - Q) - COMPREPLY=( $( compgen -W '\ - -c --changelog \ - -d --deps \ - -e --explicit \ - -g --groups \ - -h --help \ - -i --info \ - -k --check \ - -l --list \ - -m --foreign \ - -o --owns \ - -p --file \ - -s --search \ - -t --unrequired \ - -u --upgrades \ - --config \ - --logfile \ - --noconfirm \ - --noprogressbar \ - --noscriptlet \ - -v --verbose \ - -r --root \ - -b --dbpath \ - --cachedir \ - ' -- $cur ) ) - return 0 - ;; - esac - rem_selected - else - case "${op}" in - U) - COMPREPLY=( $( compgen -d -- "$cur" ) \ - $( compgen -f -X '!*.pkg.tar.*' -- "$cur" ) ) - return 0 - ;; - h|V) - COMPREPLY='' - return 0 - ;; + if [[ $? != 0 ]]; then + _arch_ptr2comp core + elif ! [[ $prev =~ ^-\w*[Vbhr] || + $prev = --@(cachedir|config|dbpath|help|logfile|root|version) ]] + then + [[ $cur = -* ]] && _arch_ptr2comp ${o#* } common || + case ${o% *} in + D|R) + _pacman_pkg Qq;; Q) - if _instring $mod g; then - _installed_groups - elif _instring $mod o; then - COMPREPLY=( $( compgen -d -- "$cur" ) \ - $( compgen -f -- "$cur" ) ) - elif _instring $mod p; then - COMPREPLY=( $( compgen -d -- "$cur" ) \ - $( compgen -f -X '!*.pkg.tar.*' -- "$cur" ) ) - elif _instring $mod u; then - COMPREPLY='' - return 0 - else - _installed_pkgs - fi - return 0 - ;; - R) - _installed_pkgs - return 0 - ;; + { _arch_incomp 'g groups' && _pacman_pkg Qg sort; } || + { _arch_incomp 'p file' && _pacman_file; } || + _arch_incomp 'o owns' || _arch_incomp 'u upgrades' || + _pacman_pkg Qq;; S) - if _instring $mod l; then - _available_repos - else - _available_pkgs - fi - return 0 - ;; - esac + { _arch_incomp 'g groups' && _pacman_pkg Sg; } || + { _arch_incomp 'l list' && _pacman_pkg Sl sort; } || + _pacman_pkg Slq;; + U) + _pacman_file;; + esac fi - - rem_selected + true } -complete -o filenames -F _pacman pacman + +complete -F _makepkg -o default makepkg +complete -F _pacman -o default pacman + +# ex:et ts=2 sw=2 ft=sh |