summaryrefslogtreecommitdiff
path: root/contrib/bash_completion.in
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bash_completion.in')
-rw-r--r--contrib/bash_completion.in113
1 files changed, 113 insertions, 0 deletions
diff --git a/contrib/bash_completion.in b/contrib/bash_completion.in
new file mode 100644
index 00000000..7f47f4b4
--- /dev/null
+++ b/contrib/bash_completion.in
@@ -0,0 +1,113 @@
+# 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
+ done
+}
+
+_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
+}
+
+_arch_incomp() {
+ local r="\s-(-${1#* }\s|\w*${1% *})"; [[ $COMP_LINE =~ $r ]]
+}
+
+_makepkg() {
+ local cur opts prev
+ COMPREPLY=()
+ _get_comp_words_by_ref cur prev
+ 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
+ true
+}
+
+_pacman_pkg() {
+ _arch_compgen "$(
+ if [[ $2 ]]; then
+ \pacman -$1 | \cut -d' ' -f1 | \sort -u
+ else
+ \pacman -$1
+ fi
+ )"
+}
+
+_pacman() {
+ local common core cur database prev query remove sync upgrade o
+ COMPREPLY=()
+ _get_comp_words_by_ref cur prev
+ 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
+
+ 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)
+ { _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)
+ { _arch_incomp 'g groups' && _pacman_pkg Sg; } ||
+ { _arch_incomp 'l list' && _pacman_pkg Sl sort; } ||
+ _pacman_pkg Slq;;
+ U)
+ _pacman_file;;
+ esac
+ fi
+ true
+}
+
+if [[ $(type -t compopt) = "builtin" ]]; then
+ _pacman_file() {
+ compopt -o filenames; _filedir 'pkg.tar.*'
+ }
+ complete -F _pacman -o default pacman
+else
+ _pacman_file() {
+ _filedir 'pkg.tar.*'
+ }
+ complete -F _pacman -o filenames -o default pacman
+fi
+
+complete -F _makepkg -o default makepkg
+
+# ex:et ts=2 sw=2 ft=sh