[pacman-dev] [PATCH 2/4] zsh completion: fix stacked completion

Daniel Wallace danielwallace at gtmanfred.com
Wed Mar 6 16:13:44 EST 2013


Before this, if you do pacman -Sy<tab> it completes to -y.  Now, with -S
and the other operations in the actual option _arguments, it won't
remove the operations.

Signed-off-by: Daniel Wallace <danielwallace at gtmanfred.com>
---
 contrib/zsh_completion.in | 66 ++++++++++++++++++++++++++++-------------------
 1 file changed, 39 insertions(+), 27 deletions(-)

diff --git a/contrib/zsh_completion.in b/contrib/zsh_completion.in
index a40192c..a92b96a 100644
--- a/contrib/zsh_completion.in
+++ b/contrib/zsh_completion.in
@@ -43,6 +43,7 @@ _pacman_opts_pkgfile=(
 
 # options for passing to _arguments: subactions for --query command
 _pacman_opts_query_actions=(
+	'-Q'
 	'-g[View all members of a package group]:*:package groups:->query_group'
 	'-o[Query the package that owns a file]:file:_files'
 	'-p[Package file to query]:*:package file:->query_file'
@@ -59,6 +60,7 @@ _pacman_opts_query_modifiers=(
 	'-k[Check package files]'
 	'-l[List package contents]'
 	'-m[List installed packages not found in sync db(s)]'
+    '-n[List installed packages found in sync db(s)]'
 	'-t[List packages not required by any package]'
 	'-u[List packages that can be upgraded]'
 )
@@ -80,6 +82,7 @@ _pacman_opts_database=(
 
 # options for passing to _arguments: options for --sync command
 _pacman_opts_sync_actions=(
+	'-S'
 	'*-c[Remove old packages from cache]:*:clean:->sync_clean'
 	'*-cc[Remove all packages from cache]:*:clean:->sync_clean'
 	'-g[View all members of a package group]:*:package groups:->sync_group'
@@ -124,11 +127,6 @@ _pacman_action_query() {
 	local context state line
 	typeset -A opt_args
 
-#	_arguments -s : \
-#		"$_pacman_opts_common[@]" \
-#		"$_pacman_opts_query_actions[@]" \
-#		"$_pacman_opts_query_modifiers[@]"
-
 	case $state in
 		query_file)
 			_arguments -s : \
@@ -167,6 +165,7 @@ _pacman_action_query() {
 # handles --remove subcommand
 _pacman_action_remove() {
 	_arguments -s : \
+		'-R' \
 		"$_pacman_opts_common[@]" \
 		"$_pacman_opts_remove[@]"
 }
@@ -186,11 +185,6 @@ _pacman_action_sync() {
 	local context state line
 	typeset -A opt_args
 
-#	_arguments -s : \
-#		"$_pacman_opts_common[@]" \
-#		"$_pacman_opts_sync_actions[@]" #\
-#		#"$_pacman_opts_sync_modifiers[@]"
-
 	case $state in
 		sync_clean)
 			_arguments -s : \
@@ -213,6 +207,7 @@ _pacman_action_sync() {
 		*)
 			_arguments -s : \
 				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_sync_actions[@]" \
 				"$_pacman_opts_sync_modifiers[@]" \
 				'*:package:_pacman_completions_all_packages'
 				;;
@@ -222,6 +217,7 @@ _pacman_action_sync() {
 # handles --upgrade subcommand
 _pacman_action_upgrade() {
 	_arguments -s : \
+		'-U' \
 		"$_pacman_opts_common[@]" \
 		"$_pacman_opts_pkgfile[@]"
 }
@@ -279,6 +275,12 @@ _pacman_completions_installed_packages() {
 	compadd "$@" -a packages
 }
 
+_pacman_all_packages() {
+    _alternative : \
+        'localpkgs:local packages:_pacman_completions_installed_packages' \
+        'repopkgs:repository packages:_pacman_completions_all_packages'
+}
+
 # provides completions for repository names
 _pacman_completions_repositories() {
 	local -a cmd repositories
@@ -304,55 +306,65 @@ _pacman_get_command() {
 
 # main dispatcher
 _pacman_zsh_comp() {
-	case $words[2] in
-		-Q*g*) # ipkg groups
+	local -a args;
+	args=( ${${${(M)words:#-*}#-}:#-*} )
+	case $args in #$words[2] in
+		h*)
+			if (( ${(c)#args} <= 1 )); then
+				_pacman_action_help
+			else
+				_message "no more arguments"
+			fi
+			;;
+		*h*)
+			_message "no more arguments"
+			;;
+		Q*g*) # ipkg groups
 			_arguments -s : \
 				"$_pacman_opts_common[@]" \
 				"$_pacman_opts_query_modifiers[@]" \
 				'*:groups:_pacman_completions_installed_groups'
 				;;
-		-Q*o*) # file
+		Q*o*) # file
 			_arguments -s : \
 				"$_pacman_opts_common[@]" \
 				"$_pacman_opts_query_modifiers[@]" \
 				'*:package file:_files'
 				;;
-		-Q*p*) # file *.pkg.tar*
+		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
-		-T*)
+		T*)
 			 _arguments -s : \
 				'-T' \
 				"$_pacman_opts_common[@]" \
 				":packages:_pacman_all_packages"
 			 ;;
-		-D*)  _pacman_action_database ;;
+		Q*)  _pacman_action_query    ;;
+		R*)  _pacman_action_remove   ;;
+		D*)  _pacman_action_database ;;
+		S*c*) # no completion
 			return 0
 			;;
-		-S*l*) # repos
+		S*l*) # repos
 			_arguments -s : \
 				"$_pacman_opts_common[@]" \
 				"$_pacman_opts_sync_modifiers[@]" \
 				'*:package repo:_pacman_completions_repositories' \
 				;;
-		-S*g*) # pkg groups
+		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                ;;
+		S*)  _pacman_action_sync     ;;
+		U*)  _pacman_action_upgrade  ;;
+		V*)  _pacman_action_version  ;;
+		*  ) _pacman_action_none     ;;
 	esac
 }
 
-- 
1.8.1.5



More information about the pacman-dev mailing list