Permalink
538f2a0 Oct 27, 2017
@luolimao @nicoulaj @panth0r @lenoch @arcan1s
369 lines (338 sloc) 12.7 KB
#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 "$@"