mirror of
https://github.com/moparisthebest/pacman
synced 2024-11-10 11:35:00 -05:00
de56874cc9
If you are a crazy developer like me and have bogus options in your pacman.conf file, the tab completion gets messed up by the output on stderr. Suppress it. Fix the same basic issue in zsh_completion, thanks to the work by Florian Pritz <bluewind@xinu.at>. Signed-off-by: Dan McGee <dan@archlinux.org>
337 lines
9.8 KiB
Plaintext
337 lines
9.8 KiB
Plaintext
#compdef pacman pacman.static=pacman
|
|
|
|
# copy this file to /usr/share/zsh/site-functions/_pacman
|
|
|
|
typeset -A opt_args
|
|
|
|
# options for passing to _arguments: main pacman commands
|
|
_pacman_opts_commands=(
|
|
'-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]'
|
|
'--cachedir[Alternate package cache location]:cache_location:_files -/'
|
|
'--config[An alternate configuration file]:config file:_files'
|
|
'--logfile[An alternate log file]:config file:_files'
|
|
'--noconfirm[Do not ask for confirmation]'
|
|
'--noprogressbar[Do not show a progress bar when downloading files]'
|
|
'--noscriptlet[Do not execute the install scriptlet if one exists]'
|
|
'--print[Only print the targets instead of performing the operation]'
|
|
)
|
|
|
|
# options for passing to _arguments: options for --upgrade commands
|
|
_pacman_opts_pkgfile=(
|
|
'-d[Skip dependency checks]'
|
|
'-f[Overwrite conflicting files]'
|
|
'--dbonly[Only remove database entry, do not remove files]'
|
|
'--needed[Do not reinstall up to date packages]'
|
|
'--recursive[Reinstall all dependencies of target packages]'
|
|
'*:package file:_files -g "*.pkg.tar*(.)"'
|
|
)
|
|
|
|
# options for passing to _arguments: subactions for --query command
|
|
_pacman_opts_query_actions=(
|
|
'-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=(
|
|
'-c[List package changelog]'
|
|
'-d[List packages installed as dependencies]'
|
|
'-e[List packages explicitly installed]'
|
|
'-i[View package information]'
|
|
'-ii[View package information including backup files]'
|
|
'-k[Check package files]'
|
|
'-l[List package contents]'
|
|
'-m[List installed packages not found in sync db(s)]'
|
|
'-t[List packages not required by any package]'
|
|
'-u[List packages that can be upgraded]'
|
|
)
|
|
|
|
# options for passing to _arguments: options for --remove command
|
|
_pacman_opts_remove=(
|
|
'-c[Remove all dependent packages]'
|
|
'-d[Skip dependency checks]'
|
|
'-n[Remove protected configuration files]'
|
|
'-s[Remove dependencies not required by other packages]'
|
|
'--dbonly[Only remove database entry, do not remove files]'
|
|
'*: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'
|
|
'*-cc[Remove all 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'
|
|
'--dbonly[Only remove database entry, do not remove files]'
|
|
'--needed[Do not reinstall up to date packages]'
|
|
'--recursive[Reinstall all dependencies of target packages]'
|
|
)
|
|
|
|
# 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_all_packages'
|
|
'*--ignoregroup[Ignore a group upgrade]:package group:
|
|
_pacman_completions_all_groups'
|
|
'--asdeps[Install packages as non-explicitly installed]'
|
|
'--asexplicit[Install packages as explicitly installed]'
|
|
)
|
|
|
|
# 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*"'
|
|
;;
|
|
query_group)
|
|
_arguments -s : \
|
|
"$_pacman_opts_common[@]" \
|
|
"$_pacman_opts_query_modifiers[@]" \
|
|
'*:groups:_pacman_completions_installed_groups'
|
|
;;
|
|
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) )
|
|
typeset -U groups
|
|
compadd "$@" -a groups
|
|
}
|
|
|
|
# provides completions for packages available from repositories
|
|
# these can be specified as either 'package' or 'repository/package'
|
|
_pacman_completions_all_packages() {
|
|
local -a cmd packages repositories packages_long
|
|
_pacman_get_command
|
|
|
|
if compset -P1 '*/*'; then
|
|
packages=( $(_call_program packages $cmd[@] -Sql ${words[CURRENT]%/*}) )
|
|
typeset -U packages
|
|
_wanted repo_packages expl "repository/package" compadd ${(@)packages}
|
|
else
|
|
packages=( $(_call_program packages $cmd[@] -Sql) )
|
|
typeset -U packages
|
|
_wanted packages expl "packages" compadd - "${(@)packages}"
|
|
|
|
repositories=(${(o)${${${(M)${(f)"$(<@sysconfdir@/pacman.conf)"}:#\[*}/\[/}/\]/}:#options})
|
|
typeset -U repositories
|
|
_wanted repo_packages expl "repository/package" compadd -S "/" $repositories
|
|
fi
|
|
}
|
|
|
|
# provides completions for package groups
|
|
_pacman_completions_installed_groups() {
|
|
local -a cmd groups
|
|
_pacman_get_command
|
|
groups=(${(o)${(f)"$(_call_program groups $cmd[@] -Qg)"}% *})
|
|
typeset -U groups
|
|
compadd "$@" -a groups
|
|
}
|
|
|
|
# provides completions for installed packages
|
|
_pacman_completions_installed_packages() {
|
|
local -a cmd packages packages_long
|
|
packages_long=(@localstatedir@/lib/pacman/local/*(/))
|
|
packages=( ${${packages_long#@localstatedir@/lib/pacman/local/}%-*-*} )
|
|
compadd "$@" -a packages
|
|
}
|
|
|
|
# provides completions for repository names
|
|
_pacman_completions_repositories() {
|
|
local -a cmd repositories
|
|
repositories=(${(o)${${${(M)${(f)"$(<@sysconfdir@/pacman.conf)"}:#\[*}/\[/}/\]/}:#options})
|
|
# Uniq the array
|
|
typeset -U repositories
|
|
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" "2>/dev/null")
|
|
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
|
|
-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
|
|
}
|
|
|
|
# run the main dispatcher
|
|
_pacman "$@"
|