[pacman-dev] CVS update of pacman-lib/contrib (bash_completion zsh_completion)

Aaron Griffin aaron at archlinux.org
Fri Feb 16 14:37:03 EST 2007


    Date: Friday, February 16, 2007 @ 14:37:03
  Author: aaron
    Path: /home/cvs-pacman/pacman-lib/contrib

   Added: bash_completion (1.1) zsh_completion (1.1)

Added a 'contrib' directory for other stuff that might be a good idea to maintain here.
* moved bash_completion from the "archlinux" script in the official bash_completion package
* moved zsh_completion from the AUR zsh-pacman package


-----------------+
 bash_completion |  348 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 zsh_completion  |  320 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 668 insertions(+)


Index: pacman-lib/contrib/bash_completion
diff -u /dev/null pacman-lib/contrib/bash_completion:1.1
--- /dev/null	Fri Feb 16 14:37:03 2007
+++ pacman-lib/contrib/bash_completion	Fri Feb 16 14:37:03 2007
@@ -0,0 +1,348 @@
+# vim: set ft=sh:
+# file: /etc/bash_completion.d/pacman
+
+# Bash completion for ArchLinux
+# Original: v.1.1 Manolis Tzanidakis <mtzanidakis at freemail.gr>
+#
+# Distributed under the terms of the GNU General Public License, v2 or later.
+#
+
+## Changelog ####################################################
+#                                                               #
+# * 1.1 (20040117)                                              #
+#   - Code cleanup                                              #
+#   - Updated to pacman 2.7.2-2                                 #
+# * 20040216 (orelien)                                          #
+#   - Improved available_{pkgs,groups) functions                #
+#   - Added support for querying groups                         #
+#                                                               #
+#################################################################
+
+## initial functions
+#
+
+rem_selected ()
+{
+  # (Adapted from bash_completion by Ian Macdonald <ian at 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%% *} / })
+    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/$r/*; done )
+  COMPREPLY=( $( compgen -W "$( for i in $available_pkgs; do j=${i##*/}; echo ${j%-*-*}; done )" -- $cur ) )
+}
+
+_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 ) )
+}
+
+_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/$r/*/desc | sort -u; done )
+  COMPREPLY=( $( compgen -W "$( for i in $available_groups; do echo ${i%-*-*}; done )" -- $cur ) )
+}
+
+## init (/etc/rc.d) script completion (quick 'n' dirty ;-)
+#
+
+complete -W "start stop restart" \
+  $(for i in /etc/rc.d/*; do echo ${i##*/}; done)
+
+## makepkg completion
+#
+
+_makepkg ()
+{
+  local cur prev
+  COMPREPLY=()
+  cur=${COMP_WORDS[COMP_CWORD]}
+  prev=${COMP_WORDS[COMP_CWORD-1]}
+
+  case "$prev" in
+    -@(p|w))
+      _filedir
+      return 0
+    ;;
+    --help|--cleancache|--genmd5)
+      COMPREPLY=''
+      return 0
+    ;;
+  esac
+
+  if [[ "$cur" == -* ]]; then
+    COMPREPLY=( $( compgen -W '-b --builddeps \
+      -c --clean \
+      -C --cleancache \
+      -d --nodeps \
+      -f --force \
+      -g --genmd5 \
+      -h --help \
+      -i --install \
+      -m --nocolor \
+      -n --nostrip \
+      -r --rmdeps \
+      -s --syncdeps \
+      -p -w' -- $cur ) )
+  fi
+
+  rem_selected
+}
+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
+        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
+      -@(A|U|F|R|S|Q|h|V))
+        op="${arg/-}"
+        mod="${mod}${a:2}"
+        ;;
+      --)
+        arg="${a:2}"
+        case "${arg}" in
+          add) op="A" ;;
+          remove) op="R" ;;
+          upgrade) op="U" ;;
+          freshen) op="F" ;;
+          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-uris) mod="${mod}p" ;;
+          search) mod="${mod}s" ;;
+          sysupgrade) mod="${mod}u" ;;
+          downloadonly) mod="${mod}w" ;;
+          refresh) mod="${mod}y" ;;
+          orphans) mod="${mod}e" ;;
+          foreign) mod="${mod}m" ;;
+          owns) mod="${mod}o" ;;
+          file) mod="${mod}p" ;;
+          search) mod="${mod}s" ;;
+          cascade) mod="${mod}c" ;;
+          nodeps) mod="${mod}d" ;;
+          dbonly) mod="${mod}k" ;;
+          nosave) mod="${mod}n" ;;
+          recursive) mod="${mod}s" ;;
+        esac ;;
+      *) toparse="${a}" ;;
+    esac
+
+    arglen=$(( ${#toparse}-1 ))
+    for c in $(seq 0 "${arglen}"); do
+      arg=${toparse:$c:1}
+      [ "${arg}" != "-" ] && mod="${mod}${arg}"
+    done
+  done
+
+  cur=${COMP_WORDS[COMP_CWORD]}
+
+  if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then
+        COMPREPLY=( $( compgen -W '\
+            -A --add \
+            -F --freshen \
+            -h --help \
+            -Q --query \
+            -R --remove \
+            -S --sync \
+            -U --upgrade \
+            -V --version \
+            ' -- $cur ) )
+        rem_selected
+        return 0
+  fi
+
+  if [[ "$cur" == -* ]]; then
+    case "${op}" in
+      A|U|F)
+        COMPREPLY=( $( compgen -W '\
+           -d --nodeps \
+           -f --force \
+           -h --help \
+           --config \
+           --noconfirm \
+           --noprogressbar \
+           -v --verbose \
+           -r --root \
+           -b --dbpath \
+           ' -- $cur ) )
+        return 0
+      ;;
+      R)
+        COMPREPLY=( $( compgen -W '\
+          -c --cascade \
+          -d --nodeps \
+          -f --force \
+          -h --help \
+          -k --dbonly \
+          -n --nosave \
+          -s --recursive \
+           --config \
+           --noconfirm \
+           --noprogressbar \
+          -v --verbose \
+          -r --root \
+          -b --dbpath \
+          ' -- $cur ) )
+        return 0
+      ;;
+      S)
+        COMPREPLY=( $( compgen -W '\
+          -c --clean \
+          -d --nodeps \
+          -f --force \
+          -g --groups \
+          -h --help \
+          -i --info \
+          -l --list \
+          -p --print-uris \
+          -s --search \
+          -u --sysupgrade \
+          -w --downloadonly \
+          -y --refresh \
+           --config \
+           --noconfirm \
+           --noprogressbar \
+          -v --verbose \
+          -r --root \
+          -b --dbpath \
+          ' -- $cur ) )
+        return 0
+      ;;
+      Q)
+        COMPREPLY=( $( compgen -W '\
+          -e --orphans \
+          -g --groups \
+          -h --help \
+          -i --info \
+          -l --list \
+          -m --foreign \
+          -o --owns \
+          -p --file \
+          -s --search \
+           --config \
+           --noconfirm \
+           --noprogressbar \
+          -v --verbose \
+          -r --root \
+          -b --dbpath \
+          ' -- $cur ) )
+        return 0
+      ;;
+    esac
+    rem_selected
+  else
+    case "${op}" in
+      A|U)
+		COMPREPLY=( $( compgen -d -- "$cur" ) \
+                    $( compgen -f -X '!*.pkg.tar.gz' -- "$cur" ) )
+        return 0
+      ;;
+      h|V)
+        COMPREPLY=''
+        return 0
+      ;;
+      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.gz' -- "$cur" ) )
+        else
+            _installed_pkgs
+        fi
+        return 0
+      ;;
+      R)
+        _installed_pkgs
+        return 0
+      ;;
+      S)
+        if _instring $mod l; then
+            _available_repos
+        else
+            _available_pkgs
+        fi
+        return 0
+      ;;
+    esac
+  fi
+
+  rem_selected
+}
+complete -o filenames -F _pacman pacman
Index: pacman-lib/contrib/zsh_completion
diff -u /dev/null pacman-lib/contrib/zsh_completion:1.1
--- /dev/null	Fri Feb 16 14:37:03 2007
+++ pacman-lib/contrib/zsh_completion	Fri Feb 16 14:37:03 2007
@@ -0,0 +1,320 @@
+# file: /usr/share/zsh/site-functions/_pacman
+# use the following in your zsh config:
+#   compdef pacman pacman.static=pacman
+
+typeset -A opt_args
+
+# options for passing to _arguments: main pacman commands
+_pacman_opts_commands=(
+	'-A[Add a package to the system]'
+	'-F[Upgrade an installed package]'
+	'-Q[Query the package database]'
+	'-R[Remove a package from the system]'
+	'-S[Synchronize packages]'
+	'-U[Upgrade a package]'
+	'-V[Display version and exit]'
+	'-h[Display usage]'
+)
+
+# options for passing to _arguments: options common to all commands
+_pacman_opts_common=(
+	'-b[Alternate database location]:database_location:_files -/'
+	'-h[Display syntax for the given operation]'
+	'-r[Set alternate installation root]:installation root:_files -/'
+	'-v[Be more verbose]'
+	'--config[An alternate configuration file]:config file:_files'
+	'--noconfirm[Do not ask for confirmation]'
+)
+
+# options for passing to _arguments: options for --add, --freshen and --update commands
+_pacman_opts_pkgfile=(
+	'-d[Skip dependency checks]'
+	'-f[Overwrite conflicting files]'
+	'*:package file:_files -g "*.pkg.tar.gz(.)"'
+)
+
+# options for passing to _arguments: subactions for --query command
+_pacman_opts_query_actions=(
+	'-e[List orphaned packages]:*:orphans:->query_orphans'
+	'-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'
+	'-s[Search package names and descriptions]:*:search text:->query_search'
+)
+
+# options for passing to _arguments: options for --query and subcommands
+_pacman_opts_query_modifiers=(
+	'-i[View package information]'
+	'-l[List package contents]'
+)
+
+# options for passing to _arguments: options for --remove command
+_pacman_opts_remove=(
+	'-c[Remove all dependent packages]'
+	'-d[Skip dependency checks]'
+	'-k[Only remove database entry, do not remove files]'
+	'-n[Remove protected configuration files]'
+	'-s[Remove dependencies not required by other packages]'
+	'*:installed package:_pacman_completions_installed_packages'
+)
+
+# options for passing to _arguments: options for --sync command
+_pacman_opts_sync_actions=(
+	'*-c[Remove old packages from cache]:*:clean:->sync_clean'
+	'-g[View all members of a package group]:*:package groups:->sync_group'
+	'-s[Search package names and descriptions]:*:search text:->sync_search'
+)
+
+# options for passing to _arguments: options for --sync command
+_pacman_opts_sync_modifiers=(
+	'-d[Skip dependency checks]'
+	'-f[Overwrite conflicting files]'
+	'-i[View package information]'
+	'-l[List all packages in a repository]'
+	'-p[Print download URIs for each package to be installed]'
+	'-u[Upgrade all out-of-date packages]'
+	'-w[Download packages only]'
+	'-y[Download fresh package databases]'
+	'*--ignore[Ignore a package upgrade]:package:_pacman_completions_installed_packages'
+)
+
+# handles --action subcommand
+_pacman_action_add() {
+	_arguments -s : \
+		"$_pacman_opts_common[@]" \
+		"$_pacman_opts_pkgfile[@]"
+}
+
+# handles --freshen subcommand
+_pacman_action_freshen() {
+	_arguments -s : \
+		"$_pacman_opts_common[@]" \
+		"$_pacman_opts_pkgfile[@]"
+}
+
+# handles --help subcommand
+_pacman_action_help() {
+	_arguments -s : \
+		"$_pacman_opts_commands[@]"
+}
+
+# handles cases where no subcommand has yet been given
+_pacman_action_none() {
+	_arguments -s : \
+		"$_pacman_opts_commands[@]"
+}
+
+# handles --query subcommand
+_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 : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_query_modifiers[@]" \
+				'*:package file:_files -g "*.pkg.tar.gz"'
+				;;
+		query_group)
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_query_modifiers[@]" \
+				'*:groups:_pacman_completions_installed_groups'
+				;;
+		query_orphans)
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_query_modifiers[@]"
+				;;
+		query_owner)
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_query_modifiers[@]" \
+				'*:file:_files'
+				;;
+		query_search)
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_query_modifiers[@]" \
+				'*:search text: '
+				;;
+		*)
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_query_actions[@]" \
+				"$_pacman_opts_query_modifiers[@]" \
+				'*:package:_pacman_completions_installed_packages'
+				;;
+	esac
+}
+
+# handles --remove subcommand
+_pacman_action_remove() {
+	_arguments -s : \
+		"$_pacman_opts_common[@]" \
+		"$_pacman_opts_remove[@]"
+}
+
+# handles --sync subcommand
+_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 : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_sync_modifiers[@]" \
+				'*-c[Remove old packages from cache]' \
+				;;
+		sync_group)
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_sync_modifiers[@]" \
+				'*:package group:_pacman_completions_all_groups'
+				;;
+		sync_search)
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_sync_modifiers[@]" \
+				'*:search text: '
+				;;
+		*)
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_sync_modifiers[@]" \
+				'*:package:_pacman_completions_all_packages'
+				;;
+		esac
+}
+
+# handles --upgrade subcommand
+_pacman_action_upgrade() {
+	_arguments -s : \
+		"$_pacman_opts_common[@]" \
+		"$_pacman_opts_pkgfile[@]"
+}
+
+# handles --version subcommand
+_pacman_action_version() {
+	# no further arguments
+	return 0
+}
+
+# provides completions for package groups
+_pacman_completions_all_groups() {
+	local -a cmd groups
+	_pacman_get_command
+	groups=( $(_call_program groups $cmd[@] -Sg | grep -e \^$PREFIX) )
+	compadd "$@" -a groups
+}
+
+# provides completions for packages available from repositories
+_pacman_completions_all_packages() {
+	local -a cmd packages repositories
+
+	repositories=( $(_call_program repositories cat /etc/pacman.conf | grep "^\[" | sed "s,\(\[\|\]\),,g" | grep -v "^options" | sort -u) )
+	# these can be specified as either 'package' or 'repository/package'
+	if [[ "$PREFIX" == "" ]] ; then
+		packages=( $(_call_program packages ls /var/lib/pacman/${^repositories} | grep -v "^/" | sed "s,\-[^-]*\-[^-]*$,," | sort -u) )
+	else
+		packages=( $(_call_program packages ls /var/lib/pacman/${^repositories} | grep -v "^/" | grep -e \^$PREFIX | sed "s,\-[^-]*\-[^-]*$,," | sort -u) )
+	fi
+	compadd "$@" -a packages
+}
+
+# provides completions for package groups
+_pacman_completions_installed_groups() {
+	local -a cmd groups
+	_pacman_get_command
+	groups=( $(_call_program installed_groups $cmd[@] -Qg | cut -d' ' -f1 | grep -e \^$PREFIX | sort -u) )
+	compadd "$@" -a groups
+}
+
+# provides completions for installed packages
+_pacman_completions_installed_packages() {
+	local -a cmd packages
+	packages=( $(_call_program installed_packages ls /var/lib/pacman/local | grep "^$PREFIX" | sed "s,\-[^-]*\-[^-]*$,,") )
+	compadd "$@" -a packages
+}
+
+# provides completions for repository names
+_pacman_completions_repositories() {
+	local -a cmd repositories
+	repositories=( $(_call_program repositories cat /etc/pacman.conf | grep "^\[" | sed "s,\(\[\|\]\),,g" | grep -v "^options" | grep "^$PREFIX" | sort -u) )
+	compadd "$@" -a repositories
+}
+
+# builds command for invoking pacman in a _call_program command - extracts
+# relevant options already specified (config file, etc)
+# $cmd must be declared by calling function
+_pacman_get_command() {
+	# this is mostly nicked from _perforce
+	cmd=( "pacman" )
+	integer i
+	for (( i = 2; i < CURRENT - 1; i++ )); do
+		if [[ ${words[i]} = "--config" || ${words[i]} = "--root" ]]; then
+			cmd+=( ${words[i,i+1]} )
+		fi
+	done
+}
+
+# main dispatcher
+_pacman() {
+	case $words[2] in
+		-A*)  _pacman_action_add      ;;
+		-F*)  _pacman_action_freshen  ;;
+		-Qg) # ipkg groups
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_query_modifiers[@]" \
+				'*:groups:_pacman_completions_installed_groups'
+				;;
+		-Qo) # file *.pkg.tar.gz
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_query_modifiers[@]" \
+				'*:package file:_files'
+				;;
+		-Qp) # file *.pkg.tar.gz
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_query_modifiers[@]" \
+				'*:package file:_files -g "*.pkg.tar.gz"'
+				;;
+		-Q*)  _pacman_action_query    ;;
+		-R*)  _pacman_action_remove   ;;
+		-Sl) # repos
+			_arguments -s : \
+				"$_pacman_opts_common[@]" \
+				"$_pacman_opts_sync_modifiers[@]" \
+				'*:package repo:_pacman_completions_repositories' \
+				;;
+		-Sg) # 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
+}
+
+# run the main dispatcher
+_pacman "$@"




More information about the pacman-dev mailing list