[pacman-dev] [PATCH] fix pacman stacked completion
Daniel Wallace
danielwallace at gtmanfred.com
Thu Nov 29 13:55:47 EST 2012
make it so that -Sy<tab> doesn't end up as -y
---
contrib/zsh_completion.in | 321 ++++++++++++++++++++++++++++------------------
1 file changed, 194 insertions(+), 127 deletions(-)
diff --git a/contrib/zsh_completion.in b/contrib/zsh_completion.in
index 84ee93c..4d1766e 100644
--- a/contrib/zsh_completion.in
+++ b/contrib/zsh_completion.in
@@ -117,11 +117,10 @@ _pacman_action_query() {
local context state line
typeset -A opt_args
-# _arguments -s : \
-# "$_pacman_opts_common[@]" \
-# "$_pacman_opts_query_actions[@]" \
-# "$_pacman_opts_query_modifiers[@]"
-
+ _arguments -s : \
+ "$_pacman_opts_common[@]" \
+ "$_pacman_opts_query_actions[@]" \
+ "$_pacman_opts_query_modifiers[@]"
case $state in
query_file)
_arguments -s : \
@@ -143,6 +142,7 @@ _pacman_action_query() {
;;
query_search)
_arguments -s : \
+ "$_pacman_opts_query_actions[@]" \
"$_pacman_opts_common[@]" \
"$_pacman_opts_query_modifiers[@]" \
'*:search text: '
@@ -169,10 +169,10 @@ _pacman_action_sync() {
local context state line
typeset -A opt_args
-# _arguments -s : \
-# "$_pacman_opts_common[@]" \
-# "$_pacman_opts_sync_actions[@]" #\
-# #"$_pacman_opts_sync_modifiers[@]"
+ _arguments -s : \
+ "$_pacman_opts_common[@]" \
+ "$_pacman_opts_sync_actions[@]" \
+ "$_pacman_opts_sync_modifiers[@]"
case $state in
sync_clean)
@@ -285,51 +285,116 @@ _pacman_get_command() {
done
}
-# main dispatcher
+_sync_shortopts=(
+ '-S[sync command]'
+ '+b[set an alternate database location]'
+ '+c[remove old packages from cache directory (-cc for all)]'
+ '-d[skip dependency version checks (-dd to skip all checks)]'
+ '-g[view all members of a package group]'
+ '*-i[view package information]'
+ '+l[view a list of packages in a repo]'
+ '-p[print the targets instead of performing the operation]'
+ '-q[show less information for query and search]'
+ '+r[set an alternate installation root]'
+ '+s[search remote repositories for matching strings]'
+ '-u[upgrade installed packages (-uu allows downgrade)]'
+ '-v[be verbose]'
+ '-w[download packages but do not install/upgrade anything]'
+ '*-y[download fresh package databases from the server]'
+)
+
+_query_shortopts=(
+ '-Q[query command]'
+ '+b[an alternate database location]'
+ '-c[view the changelog of a package]'
+ '-d[list packages installed as dependencies]'
+ '-e[list packages explicitly installed]'
+ '+g[view all members of a package group]'
+ '*-i[view package information (-ii for backup files)]'
+ '-k[check that the files owned by the package(s) are present]'
+ '-l[list the contents of the queried package]'
+ '-m[list installed packages not found in sync db(s)]'
+ '-n[list installed packages only found in sync db(s)]'
+ '+o[query the package that own <file>]'
+ '+p[query a package file instead of the database]'
+ '-q[show less information for query and search]'
+ '+r[set an alternate installation root]'
+ '+s[search locally-installed packages for matching strings]'
+ '-t[list packages not required by any package]'
+ '-u[list outdated packages]'
+ '-v[be verbose]'
+ )
+
+
+_pacman_maincomp(){
+ case $1 in
+ -Q*g) # ipkg groups
+ _arguments -s : \
+ "$_pacman_opts_common[@]" \
+ "$_pacman_opts_query_modifiers[@]" \
+ '*:groups:_pacman_completions_installed_groups'
+ ;;
+ -Q*o) # file
+ _arguments -s : \
+ "$_pacman_opts_common[@]" \
+ "$_pacman_opts_query_modifiers[@]" \
+ '*:package file:_files'
+ ;;
+ -Q*p) # file *.pkg.tar*
+ _arguments -s : \
+ "$_pacman_opts_common[@]" \
+ "$_pacman_opts_query_modifiers[@]" \
+ '*:package file:_files -g "*.pkg.tar*"'
+ ;;
+ -Q*b)
+ _arguments -s : \
+ "$_pacman_opts_common[@]" \
+ "$_pacman_opts_query_modifiers[@]" \
+ '*:package file:_files -/'
+ ;;
+ -Q*r)
+ _arguments '*:change root:_files -/'
+ ;;
+ -Q*s)
+ _message "regex";
+ ;;
+ -Q*) _pacman_action_query ;;
+ -R*) _pacman_action_remove ;;
+ -S*c*) # no completion
+ return 0
+ ;;
+ -S*l) # repos
+ _arguments -s : \
+ "$_pacman_opts_common[@]" \
+ "$_pacman_opts_sync_modifiers[@]" \
+ '*:package repo:_pacman_completions_repositories' \
+ ;;
+ -S*g) # pkg groups
+ _arguments -s : \
+ "$_pacman_opts_common[@]" \
+ "$_pacman_opts_sync_modifiers[@]" \
+ '*:package group:_pacman_completions_all_groups'
+ ;;
+ -S*) _pacman_action_sync ;;
+ -U*) _pacman_action_upgrade ;;
+ -V*) _pacman_action_version ;;
+ -h*) _pacman_action_help ;;
+ - ) _pacman_action_none ;;
+ * ) _pacman_action_sync ;;
+ esac
+}
_pacman_zsh_comp() {
- case $words[2] in
- -Q*g*) # ipkg groups
- _arguments -s : \
- "$_pacman_opts_common[@]" \
- "$_pacman_opts_query_modifiers[@]" \
- '*:groups:_pacman_completions_installed_groups'
- ;;
- -Q*o*) # file
- _arguments -s : \
- "$_pacman_opts_common[@]" \
- "$_pacman_opts_query_modifiers[@]" \
- '*:package file:_files'
- ;;
- -Q*p*) # file *.pkg.tar*
- _arguments -s : \
- "$_pacman_opts_common[@]" \
- "$_pacman_opts_query_modifiers[@]" \
- '*:package file:_files -g "*.pkg.tar*"'
- ;;
- -Q*) _pacman_action_query ;;
- -R*) _pacman_action_remove ;;
- -S*c*) # no completion
- return 0
- ;;
- -S*l*) # repos
- _arguments -s : \
- "$_pacman_opts_common[@]" \
- "$_pacman_opts_sync_modifiers[@]" \
- '*:package repo:_pacman_completions_repositories' \
- ;;
- -S*g*) # pkg groups
- _arguments -s : \
- "$_pacman_opts_common[@]" \
- "$_pacman_opts_sync_modifiers[@]" \
- '*:package group:_pacman_completions_all_groups'
- ;;
- -S*) _pacman_action_sync ;;
- -U*) _pacman_action_upgrade ;;
- -V*) _pacman_action_version ;;
- -h*) _pacman_action_help ;;
- - ) _pacman_action_none ;;
- * ) return 1 ;;
- esac
+ varcur="${(M)#words:#-*}"
+ if (( varcur == 1 )) && (( CURRENT < 3 )); then
+ case ${(M)words:#-*} in
+ -S*) _arguments -s -w "$_sync_shortopts[@]" ;;
+ -Q*) _arguments -s -w "$_query_shortopts[@]" ;;
+ esac
+ else
+ if _pacman_maincomp ${${(M)words:#-*}[-1]} ; then
+ _pacman_maincomp $words[2]
+ fi
+ fi
}
_key_shortopts=(
@@ -373,39 +438,39 @@ _pacman_key_options=(
)
_pacman_key() {
- case $words[CURRENT] in
- --*)
- _arguments -s : \
- "$_pacman_key_options[@]" \
- "$_key_longopts[@]"
- ;;
- -*)
- _arguments -s : \
- "$_pacman_key_options[@]" \
- "$_key_shortopts[@]" \
- "$_key_longopts[@]"
- ;;
- *)
- i=$#;
- while [[ $words[$i] != -* ]] && [[ $words[$i] != "pacman-key" ]];do
- i=$(($i-1))
- done
- case $i in
- --*)
- _arguments -s : \
- "$_pacman_key_options[@]" \
- "$_key_longopts[@]"
- ;;
- -*)
- _arguments -s : \
- "$_pacman_key_options[@]" \
- "$_key_shortopts[@]" \
- "$_key_longopts[@]"
- ;;
- *) return 1;;
- esac
- ;;
- esac
+ case $words[CURRENT] in
+ --*)
+ _arguments -s : \
+ "$_pacman_key_options[@]" \
+ "$_key_longopts[@]"
+ ;;
+ -*)
+ _arguments -s : \
+ "$_pacman_key_options[@]" \
+ "$_key_shortopts[@]" \
+ "$_key_longopts[@]"
+ ;;
+ *)
+ i=$#;
+ while [[ $words[$i] != -* ]] && [[ $words[$i] != "pacman-key" ]];do
+ i=$(($i-1))
+ done
+ case $i in
+ --*)
+ _arguments -s : \
+ "$_pacman_key_options[@]" \
+ "$_key_longopts[@]"
+ ;;
+ -*)
+ _arguments -s : \
+ "$_pacman_key_options[@]" \
+ "$_key_shortopts[@]" \
+ "$_key_longopts[@]"
+ ;;
+ *) return 1;;
+ esac
+ ;;
+ esac
}
_keys() {
@@ -487,49 +552,51 @@ _makepkg_longopts=(
'--noprogressbar[Do not show a progress bar when downloading files]'
)
_makepkg(){
- case $words[CURRENT] in
- -*)
- _arguments -s -w : \
- "$_makepkg_shortopts[@]" \
- "$_makepkg_longopts[@]"
- ;;
- --* )
- _arguments -s \
- "$_makepkg_longopts[@]"
- ;;
- - )_makepkg_action_none ;;
- * )
- i=$#
- while [[ $words[i] != -* ]] && [[ $words[$i] != "makepkg" ]];do
- i=$((i-1));
- done
- case $words[$i] in
- -*)
- _arguments -s -w : \
- "$_makepkg_shortopts[@]" \
- "$_makepkg_longopts[@]"
- ;;
- --* )
- _arguments -s \
- "$_makepkg_longopts[@]"
- ;;
- - )_makepkg_action_none ;;
- * ) return 1 ;;
- esac
- ;;
- esac
+ case $words[CURRENT] in
+ -*)
+ _arguments -s -w : \
+ "$_makepkg_shortopts[@]" \
+ "$_makepkg_longopts[@]"
+ ;;
+ --* )
+ _arguments -s \
+ "$_makepkg_longopts[@]"
+ ;;
+ - )_makepkg_action_none ;;
+ * )
+ i=$#
+ while [[ $words[i] != -* ]] && [[ $words[$i] != "makepkg" ]];do
+ i=$((i-1));
+ done
+ case $words[$i] in
+ -*)
+ _arguments -s -w : \
+ "$_makepkg_shortopts[@]" \
+ "$_makepkg_longopts[@]"
+ ;;
+ --* )
+ _arguments -s \
+ "$_makepkg_longopts[@]"
+ ;;
+ - )_makepkg_action_none ;;
+ * ) return 1 ;;
+ esac
+ ;;
+ esac
}
_pacman_comp() {
- case "$service" in
- makepkg)
- _makepkg "$@";;
- pacman-key)
- _pacman_key "$@";;
- pacman)
- _pacman_zsh_comp "$@";;
- *)
- _message "Error";;
- esac
+ case "$service" in
+ makepkg)
+ _makepkg "$@";;
+ pacman-key)
+ _pacman_key "$@";;
+ pacman)
+ _pacman_zsh_comp "$@";;
+ *)
+ _message "Error";;
+ esac
}
_pacman_comp "$@"
+
+#vim: set ft=zsh ts=4 sw=4 et
--
1.8.0.1
More information about the pacman-dev
mailing list