369 lines
13 KiB
Plaintext
369 lines
13 KiB
Plaintext
|
#compdef yaourt yaourt.static=yaourt
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Description
|
||
|
# -----------
|
||
|
#
|
||
|
# Completion script for yaourt (https://archlinux.fr/yaourt-en)
|
||
|
#
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Authors
|
||
|
# -------
|
||
|
#
|
||
|
# * zsh-users mailing list
|
||
|
#
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
# handles --help subcommand
|
||
|
_yaourt_action_help() {
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_commands[@]"
|
||
|
}
|
||
|
|
||
|
# handles cases where no subcommand has yet been given
|
||
|
_yaourt_action_none() {
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_commands[@]"
|
||
|
}
|
||
|
|
||
|
# handles --query subcommand
|
||
|
_yaourt_action_query() {
|
||
|
local context state line
|
||
|
typeset -A opt_args
|
||
|
|
||
|
# _arguments -s : \
|
||
|
# "$_yaourt_opts_common[@]" \
|
||
|
# "$_yaourt_opts_query_actions[@]" \
|
||
|
# "$_yaourt_opts_query_modifiers[@]"
|
||
|
|
||
|
case $state in
|
||
|
query_file)
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_query_modifiers[@]" \
|
||
|
'*:package file:_files -g "*.pkg.tar*"'
|
||
|
;;
|
||
|
query_group)
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_query_modifiers[@]" \
|
||
|
'*:groups:_yaourt_completions_installed_groups'
|
||
|
;;
|
||
|
query_owner)
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_query_modifiers[@]" \
|
||
|
'*:file:_files'
|
||
|
;;
|
||
|
query_search)
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_query_modifiers[@]" \
|
||
|
'*:search text: '
|
||
|
;;
|
||
|
*)
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_query_actions[@]" \
|
||
|
"$_yaourt_opts_query_modifiers[@]" \
|
||
|
'*:package:_yaourt_completions_installed_packages'
|
||
|
;;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
# handles --remove subcommand
|
||
|
_yaourt_action_remove() {
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_remove[@]"
|
||
|
}
|
||
|
|
||
|
# handles --sync subcommand
|
||
|
_yaourt_action_sync() {
|
||
|
local context state line
|
||
|
typeset -A opt_args
|
||
|
|
||
|
# _arguments -s : \
|
||
|
# "$_yaourt_opts_common[@]" \
|
||
|
# "$_yaourt_opts_sync_actions[@]" #\
|
||
|
# #"$_yaourt_opts_sync_modifiers[@]"
|
||
|
|
||
|
case $state in
|
||
|
sync_clean)
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_sync_modifiers[@]" \
|
||
|
'*-c[remove old packages from cache]' \
|
||
|
;;
|
||
|
sync_group)
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_sync_modifiers[@]" \
|
||
|
'*:package group:_yaourt_completions_all_groups'
|
||
|
;;
|
||
|
sync_search)
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_sync_modifiers[@]" \
|
||
|
'*:search text: '
|
||
|
;;
|
||
|
*)
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_sync_modifiers[@]" \
|
||
|
'*:package:_yaourt_completions_all_packages'
|
||
|
;;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
# handles --upgrade subcommand
|
||
|
_yaourt_action_upgrade() {
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_pkgfile[@]"
|
||
|
}
|
||
|
|
||
|
# handles --version subcommand
|
||
|
_yaourt_action_version() {
|
||
|
# no further arguments
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
# provides completions for package groups
|
||
|
_yaourt_completions_all_groups() {
|
||
|
local -a cmd groups
|
||
|
_yaourt_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'
|
||
|
_yaourt_completions_all_packages() {
|
||
|
local -a cmd packages repositories packages_long
|
||
|
_yaourt_get_command
|
||
|
|
||
|
if compset -P1 '*/*'; then
|
||
|
packages=( $(_call_program packages $cmd[@] -Sql ${words[CURRENT]%/*}) )
|
||
|
typeset -U packages
|
||
|
if [[ -d /var/aur ]]; then
|
||
|
packages=( $packages $(ls /var/aur) )
|
||
|
fi
|
||
|
_wanted repo_packages expl "repository/package" compadd ${(@)packages}
|
||
|
else
|
||
|
packages=( $(_call_program packages $cmd[@] -Sql) )
|
||
|
typeset -U packages
|
||
|
if [[ -d /var/aur ]]; then
|
||
|
packages=( $packages $(ls /var/aur) )
|
||
|
fi
|
||
|
_wanted packages expl "packages" compadd - "${(@)packages}"
|
||
|
|
||
|
repositories=(${(o)${${${(M)${(f)"$(</etc/pacman.conf)"}:#\[*}/\[/}/\]/}:#options})
|
||
|
typeset -U repositories
|
||
|
_wanted repo_packages expl "repository/package" compadd -S "/" $repositories
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# provides completions for package groups
|
||
|
_yaourt_completions_installed_groups() {
|
||
|
local -a cmd groups
|
||
|
_yaourt_get_command
|
||
|
groups=(${(o)${(f)"$(_call_program groups $cmd[@] -Qg)"}% *})
|
||
|
typeset -U groups
|
||
|
compadd "$@" -a groups
|
||
|
}
|
||
|
|
||
|
# provides completions for installed packages
|
||
|
_yaourt_completions_installed_packages() {
|
||
|
local -a cmd packages packages_long
|
||
|
packages_long=(/var/lib/pacman/local/*(/))
|
||
|
packages=( ${${packages_long#/var/lib/pacman/local/}%-*-*} )
|
||
|
compadd "$@" -a packages
|
||
|
}
|
||
|
|
||
|
# provides completions for repository names
|
||
|
_yaourt_completions_repositories() {
|
||
|
local -a cmd repositories
|
||
|
repositories=(${(o)${${${(M)${(f)"$(</etc/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
|
||
|
_yaourt_get_command() {
|
||
|
# this is mostly nicked from _perforce
|
||
|
cmd=$( grep "^PACMAN=" "/etc/yaourtrc" \
|
||
|
&& grep "^PACMAN=" "/etc/yaourtrc" | cut -c8- \
|
||
|
|| echo "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
|
||
|
_yaourt() {
|
||
|
typeset -A opt_args
|
||
|
|
||
|
# options for passing to _arguments: main pacman commands
|
||
|
typeset -a _yaourt_opts_commands
|
||
|
_yaourt_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 information]'
|
||
|
'-B[backup pacman database]'
|
||
|
'-G[get PKGBUILD]'
|
||
|
'-C[clean backup files]'
|
||
|
'--stats[package statistics]'
|
||
|
)
|
||
|
|
||
|
# options for passing to _arguments: options common to all commands
|
||
|
typeset -a _yaourt_opts_common
|
||
|
_yaourt_opts_common=(
|
||
|
'-b[alternate database location]:database_location:_files -/'
|
||
|
'-h[display syntax for the given operation]'
|
||
|
'-r[alternate installation root]:installation root:_files -/'
|
||
|
'-v[be more verbose]'
|
||
|
'--cachedir[specify alternate package cache location]:cache_location:_files -/'
|
||
|
'--config[specify alternate configuration file]:config file:_files'
|
||
|
'--debug[display debug messages]'
|
||
|
'--gpgdir[specify alternate GnuPG home directory]:gpg_directory:_files -/'
|
||
|
'--logfile[specify alternate log file]:config file:_files'
|
||
|
"--noconfirm[don't ask for confirmation]"
|
||
|
"--noprogressbar[don't show a progress bar when downloading files]"
|
||
|
"--noscriptlet[don't 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
|
||
|
typeset -a _yaourt_opts_pkgfile
|
||
|
_yaourt_opts_pkgfile=(
|
||
|
'-d[skip dependency checks]'
|
||
|
'-f[overwrite conflicting files]'
|
||
|
'*:package file:_files -g "*.pkg.tar*(.)"'
|
||
|
)
|
||
|
|
||
|
# options for passing to _arguments: subactions for --query command
|
||
|
typeset -a _yaourt_opts_query_actions
|
||
|
_yaourt_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
|
||
|
typeset -a _yaourt_opts_query_modifiers
|
||
|
_yaourt_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]'
|
||
|
'--aur[install packages from aur, even if they are in community, or, with the -u option, update packages installed from aur]'
|
||
|
'--devel[used with -u updates all cvs/svn/git/hg/bzr packages]'
|
||
|
'--date[list packages sorted in ascending order (oldest first) by installation date]'
|
||
|
)
|
||
|
|
||
|
# options for passing to _arguments: options for --remove command
|
||
|
typeset -a _yaourt_opts_remove
|
||
|
_yaourt_opts_remove=(
|
||
|
'-c[remove all dependent packages]'
|
||
|
'-d[skip dependency checks]'
|
||
|
"-k[only remove database entry, don't remove files]"
|
||
|
'-n[remove protected configuration files]'
|
||
|
'-s[remove dependencies not required by other packages]'
|
||
|
'*:installed package:_yaourt_completions_installed_packages'
|
||
|
)
|
||
|
|
||
|
# options for passing to _arguments: options for --sync command
|
||
|
typeset -a _yaourt_opts_sync_actions
|
||
|
_yaourt_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 group:->sync_group'
|
||
|
'-s[search package names and descriptions]:*:search text:->sync_search'
|
||
|
)
|
||
|
|
||
|
# options for passing to _arguments: options for --sync command
|
||
|
typeset -a _yaourt_opts_sync_modifiers
|
||
|
_yaourt_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:
|
||
|
_yaourt_completions_all_packages'
|
||
|
'*--ignoregroup[ignore a group upgrade]:package group:
|
||
|
_yaourt_completions_all_groups'
|
||
|
'--asdeps[install packages as non-explicitly installed]'
|
||
|
'--asexplicit[install packages as explicitly installed]'
|
||
|
"--needed[don't reinstall up to date packages]"
|
||
|
'--devel[used with -u updates all cvs/svn/git/hg/bzr packages]'
|
||
|
)
|
||
|
|
||
|
case $words[2] in
|
||
|
-Q*g*) # ipkg groups
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_query_modifiers[@]" \
|
||
|
'*:groups:_yaourt_completions_installed_groups'
|
||
|
;;
|
||
|
-Q*o*) # file
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_query_modifiers[@]" \
|
||
|
'*:package file:_files'
|
||
|
;;
|
||
|
-Q*p*) # file *.pkg.tar*
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_query_modifiers[@]" \
|
||
|
'*:package file:_files -g "*.pkg.tar*"'
|
||
|
;;
|
||
|
-Q*) _yaourt_action_query ;;
|
||
|
-R*) _yaourt_action_remove ;;
|
||
|
-S*c*) # no completion
|
||
|
return 0
|
||
|
;;
|
||
|
-S*l*) # repos
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_sync_modifiers[@]" \
|
||
|
'*:package repo:_yaourt_completions_repositories' \
|
||
|
;;
|
||
|
-S*g*) # pkg groups
|
||
|
_arguments -s : \
|
||
|
"$_yaourt_opts_common[@]" \
|
||
|
"$_yaourt_opts_sync_modifiers[@]" \
|
||
|
'*:package group:_yaourt_completions_all_groups'
|
||
|
;;
|
||
|
-S*) _yaourt_action_sync ;;
|
||
|
-U*) _yaourt_action_upgrade ;;
|
||
|
-V*) _yaourt_action_version ;;
|
||
|
-h*) _yaourt_action_help ;;
|
||
|
- ) _yaourt_action_none ;;
|
||
|
* ) return 1 ;;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
# run the main dispatcher
|
||
|
_yaourt "$@"
|