Update Italian translation
[pacman-ng.git] / contrib / bash_completion
blob11f021c8074fb0bf0ff19990e3937eaa05c9f241
1 # vim: set ft=sh ts=2 sw=2 et:
2 # file: /etc/bash_completion.d/pacman
4 # Bash completion for pacman
5 # Original: Manolis Tzanidakis <mtzanidakis@freemail.gr>
7 # Distributed under the terms of the GNU General Public License, v2 or later.
10 ## initial functions
12 rem_selected ()
14   # (Adapted from bash_completion by Ian Macdonald <ian@caliban.org>)
15   # This removes any options from the list of completions that have
16   # already been specified on the command line.
17   COMPREPLY=($(echo "${COMP_WORDS[@]}" | \
18     (while read -d ' ' i; do
19       [ "${i}" == "" ] && continue
20       # flatten array with spaces on either side,
21       # otherwise we cannot grep on word boundaries of
22       # first and last word
23       COMPREPLY=" ${COMPREPLY[@]} "
24       # remove word from list of completions
25       COMPREPLY=(${COMPREPLY/ ${i%% *} / })
26     done
27     echo ${COMPREPLY[@]})))
28   return 0
31 _available_repos ()
33   COMPREPLY=( $( compgen -W "$(grep '\[' /etc/pacman.conf | grep -v -e 'options' -e '^#' | tr -d '[]' )" -- $cur ) )
36 _installed_pkgs ()
38   local installed_pkgs
39   installed_pkgs=$( ls /var/lib/pacman/local/ )
40   COMPREPLY=( $( compgen -W "$( for i in $installed_pkgs; do echo ${i%-*-*}; done )" -- $cur ) )
43 _available_pkgs ()
45   #find balks easilly on a find /foo/*/* type dir, especially one like
46   #   /var/lib/pacman/*/*
47   # This little change-up removes the find *and* only uses enabled repos
48   local available_pkgs
49   local enabled_repos
50   enabled_repos=$( grep '\[' /etc/pacman.conf | grep -v -e 'options' -e '^#' | tr -d '[]' )
51   available_pkgs=$( for r in $enabled_repos; do echo /var/lib/pacman/sync/$r/*; done )
52   COMPREPLY=( $( compgen -W "$( for i in $available_pkgs; do j=${i##*/}; echo ${j%-*-*}; done )" -- $cur ) )
55 _installed_groups ()
57   local installed_groups
58   installed_groups=$( find /var/lib/pacman/local -name desc -exec sed -ne '/%GROUPS%/,/^$/{//d; p}' {} \; | sort -u )
59   COMPREPLY=( $( compgen -W "$( for i in $installed_groups; do echo ${i%-*-*}; done )" -- $cur ) )
62 _available_groups ()
64   #find balks easilly on a find /foo/*/* type dir, especially one like
65   #   /var/lib/pacman/*/*
66   # This little change-up removes the find *and* only uses enabled repos
67   local available_groups
68   local enabled_repos
69   enabled_repos=$( grep '\[' /etc/pacman.conf | grep -v -e 'options' -e '^#' | tr -d '[]' )
70   available_groups=$( for r in $enabled_repos; do sed '/%GROUPS%/,/^$/{//d; p}' /var/lib/pacman/sync/$r/*/desc | sort -u; done )
71   COMPREPLY=( $( compgen -W "$( for i in $available_groups; do echo ${i%-*-*}; done )" -- $cur ) )
74 ## makepkg completion
76 _makepkg ()
78   local cur prev
79   COMPREPLY=()
80   cur=${COMP_WORDS[COMP_CWORD]}
81   prev=${COMP_WORDS[COMP_CWORD-1]}
83   case "$prev" in
84     -p)
85       _filedir
86       return 0
87     ;;
88     --help|--cleancache)
89       COMPREPLY=''
90       return 0
91     ;;
92   esac
94   if [[ "$cur" == -* ]]; then
95     COMPREPLY=( $( compgen -W '\
96       -A --ignorearch \
97       -b --builddeps \
98       -c --clean \
99       -C --cleancache \
100       -d --nodeps \
101       -e --noextract \
102       -f --force \
103       -g --geninteg \
104       -h --help \
105       -i --install \
106       -L --log \
107       -m --nocolor \
108       -o --nobuild \
109       -p \
110       -r --rmdeps \
111       -s --syncdeps \
112       --asroot \
113       --source \
114       --noconfirm \
115       --noprogressbar' -- $cur ) )
116   fi
118   rem_selected
120 complete -o default -F _makepkg makepkg
122 ## pacman completion
124 _instring ()
126   str="${1}"
127   shift 1
128   for c in "${@}"; do
129     if [ $(expr index "${str}" "${c}") -gt 0 ]; then
130       return 0
131     fi
132   done
133   return 1
136 _pacman ()
138   local a arg toparse op mod cur
139   COMPREPLY=()
141   # This argument parsing is done so we can check for flag existance later
142   #  right now it's a tad crappy, but does the job
143   for (( i=1; i < ${#COMP_WORDS[@]}-1; i++ )); do
144     a=${COMP_WORDS[i]}
145     arg="${a:0:2}"
146     toparse="${a:2}"
148     case "${arg}" in
149       -@(U|R|S|Q|h|V))
150         op="${arg/-}"
151         mod="${mod}${a:2}"
152         ;;
153       --)
154         arg="${a:2}"
155         case "${arg}" in
156           remove) op="R" ;;
157           upgrade) op="U" ;;
158           query) op="Q" ;;
159           sync) op="S" ;;
160           help) op="h" ;;
161           version) op="V" ;;
162           verbose) mod="${mod}v" ;;
163           root) mod="${mod}r" ;;
164           dbpath) mod="${mod}b" ;;
165           nodeps) mod="${mod}d" ;;
166           force) mod="${mod}f" ;;
167           groups) mod="${mod}g" ;;
168           info) mod="${mod}i" ;;
169           list) mod="${mod}l" ;;
170           print-uris) mod="${mod}p" ;;
171           search) mod="${mod}s" ;;
172           sysupgrade) mod="${mod}u" ;;
173           upgrades) mod="${mod}u" ;;
174           downloadonly) mod="${mod}w" ;;
175           refresh) mod="${mod}y" ;;
176           changelog) mod="${mod}c" ;;
177           deps) mod="${mod}d" ;;
178           explicit) mod="${mod}e" ;;
179           unrequired) mod="${mod}t" ;;
180           foreign) mod="${mod}m" ;;
181           owns) mod="${mod}o" ;;
182           file) mod="${mod}p" ;;
183           search) mod="${mod}s" ;;
184           upgrades) mod="${mod}u" ;;
185           cascade) mod="${mod}c" ;;
186           dbonly) mod="${mod}k" ;;
187           nosave) mod="${mod}n" ;;
188           recursive) mod="${mod}s" ;;
189           unneeded) mod="${mod}u" ;;
190         esac ;;
191       *) toparse="${a}" ;;
192     esac
194     arglen=$(( ${#toparse}-1 ))
195     for c in $(seq 0 "${arglen}"); do
196       arg=${toparse:$c:1}
197       [ "${arg}" != "-" ] && mod="${mod}${arg}"
198     done
199   done
201   cur=${COMP_WORDS[COMP_CWORD]}
203   if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then
204     COMPREPLY=( $( compgen -W '\
205       -h --help \
206       -Q --query \
207       -R --remove \
208       -S --sync \
209       -U --upgrade \
210       -V --version \
211       ' -- $cur ) )
212     rem_selected
213     return 0
214   fi
216   if [[ "$cur" == -* ]]; then
217     case "${op}" in
218       U)
219         COMPREPLY=( $( compgen -W '\
220           --asdeps \
221           --asexplicit \
222           -d --nodeps \
223           -f --force \
224           -h --help \
225           --config \
226           --logfile \
227           --noconfirm \
228           --noprogressbar \
229           --noscriptlet \
230           -v --verbose \
231           -r --root \
232           -b --dbpath \
233           --cachedir \
234           ' -- $cur ) )
235         return 0
236         ;;
237       R)
238         COMPREPLY=( $( compgen -W '\
239           -c --cascade \
240           -d --nodeps \
241           -h --help \
242           -k --dbonly \
243           -n --nosave \
244           -s --recursive \
245           -u --unneeded \
246           --config \
247           --logfile \
248           --noconfirm \
249           --noprogressbar \
250           --noscriptlet \
251           -v --verbose \
252           -r --root \
253           -b --dbpath \
254           --cachedir \
255           ' -- $cur ) )
256         return 0
257         ;;
258       S)
259         COMPREPLY=( $( compgen -W '\
260           --asdeps \
261           --asexplicit \
262           -c --clean \
263           -d --nodeps \
264           -f --force \
265           -g --groups \
266           -h --help \
267           -i --info \
268           -l --list \
269           -p --print-uris \
270           -s --search \
271           -u --sysupgrade \
272           -w --downloadonly \
273           -y --refresh \
274           --needed \
275           --ignore \
276           --ignoregroup \
277           --config \
278           --logfile \
279           --noconfirm \
280           --noprogressbar \
281           --noscriptlet \
282           -v --verbose \
283           -r --root \
284           -b --dbpath \
285           --cachedir \
286           ' -- $cur ) )
287         return 0
288         ;;
289       Q)
290         COMPREPLY=( $( compgen -W '\
291           -c --changelog \
292           -d --deps \
293           -e --explicit \
294           -g --groups \
295           -h --help \
296           -i --info \
297           -l --list \
298           -m --foreign \
299           -o --owns \
300           -p --file \
301           -s --search \
302           -t --unrequired \
303           -u --upgrades \
304           --config \
305           --logfile \
306           --noconfirm \
307           --noprogressbar \
308           --noscriptlet \
309           -v --verbose \
310           -r --root \
311           -b --dbpath \
312           --cachedir \
313           ' -- $cur ) )
314         return 0
315         ;;
316     esac
317     rem_selected
318   else
319     case "${op}" in
320       U)
321         COMPREPLY=( $( compgen -d -- "$cur" ) \
322                     $( compgen -f -X '!*.pkg.tar.gz' -- "$cur" ) )
323         return 0
324         ;;
325       h|V)
326         COMPREPLY=''
327         return 0
328         ;;
329       Q)
330         if _instring $mod g; then
331           _installed_groups
332         elif _instring $mod o; then
333           COMPREPLY=( $( compgen -d -- "$cur" ) \
334                       $( compgen -f -- "$cur" ) )
335         elif _instring $mod p; then
336           COMPREPLY=( $( compgen -d -- "$cur" ) \
337                       $( compgen -f -X '!*.pkg.tar.gz' -- "$cur" ) )
338         elif _instring $mod u; then
339           COMPREPLY=''
340           return 0
341         else
342           _installed_pkgs
343         fi
344         return 0
345         ;;
346       R)
347         _installed_pkgs
348         return 0
349         ;;
350       S)
351         if _instring $mod l; then
352           _available_repos
353         else
354           _available_pkgs
355         fi
356         return 0
357         ;;
358     esac
359   fi
361   rem_selected
363 complete -o filenames -F _pacman pacman