|
|
# ZSH completion function for Portage | # ZSH completion function for Portage |
# Author: baptux <bapt@ifrance.com> | # Author: baptux <bapt@ifrance.com> |
# Author: Mamoru KOMACHI <usata@gentoo.org> | # Author: Mamoru KOMACHI <usata@gentoo.org> |
|
# Author: oberyno <oberyno@gmail.com> |
| |
# Already done: | # Already done: |
# | # |
# emerge (fully done) |
# emerge (fully done) |
# rc-update (fully done) | # rc-update (fully done) |
# rc-status (fully done) | # rc-status (fully done) |
# ebuild (fully done) | # ebuild (fully done) |
|
|
'package[This command is a lot like the merge command, but create a .tbz2 package]' \ | 'package[This command is a lot like the merge command, but create a .tbz2 package]' \ |
'rpm[Builds a RedHat RPM package]' | 'rpm[Builds a RedHat RPM package]' |
fi | fi |
|
|
} | } |
| |
# Stuff for rc-status | # Stuff for rc-status |
|
|
# Stuff for rc-update | # Stuff for rc-update |
| |
_rc-update () { | _rc-update () { |
|
local used_init |
|
used_init=(${=${(M)${(f)"$(rc-update show 2>/dev/null)"}:#*|*[a-z]*}% |*}) |
if (( CURRENT == 2 ));then | if (( CURRENT == 2 ));then |
_values "rc-update actions" \ | _values "rc-update actions" \ |
'add[Add script to a runlevel]' \ | 'add[Add script to a runlevel]' \ |
|
|
'-s[Show scripts lanched at a runlevel]' | '-s[Show scripts lanched at a runlevel]' |
elif (( CURRENT == 3 ));then | elif (( CURRENT == 3 ));then |
case "$words[2]" in | case "$words[2]" in |
add|-a|del|-d) |
add|-a) |
_arguments -s \ |
_values "scripts" /etc/init.d/*~*.sh(:t) |
'*:scripts:_files -W /etc/init.d/' |
;; |
|
del|-d) |
|
_values "scripts" $used_init |
;; | ;; |
show|-s) | show|-s) |
_values "runlevels" $gentoo_runlevels | _values "runlevels" $gentoo_runlevels |
|
|
# Stuff for quickpkg | # Stuff for quickpkg |
| |
_quickpkg () { | _quickpkg () { |
if compset -P '(\\|)[><][=]'; then |
if compset -P '(\\|)(>=|<=|<|>|=)'; then |
_arguments -s \ | _arguments -s \ |
'*:installed pkgname with versions:_portage_unmerge_vers' && return 0 |
'*:installed package:_gentoo_packages installed_versions' |
elif compset -P '(\\|)[<=>]'; then |
|
_arguments -s \ |
|
'*:installed pkgname with versions:_portage_unmerge_vers' && return 0 |
|
elif compset -P '(\\|)[/]'; then | elif compset -P '(\\|)[/]'; then |
_files -W / -/ && return 0 |
_path_files -W / -/ |
else |
else |
_arguments -s \ |
_arguments \ |
'*:installed pkgname:_portage_quickpkg' && return 0 |
'*:installed package:_gentoo_packages installed' |
fi | fi |
} | } |
|
|
# Stuff for emerge | # Stuff for emerge |
| |
_emerge () { | _emerge () { |
local state |
local nopkg_opts all noask_opts bopts install_args common_args profiles |
if (( CURRENT == 2 ));then |
|
_arguments -s \ |
|
'*:*:->actions' \ |
|
"$common_args[@]" "$install_args[@]" && return 0 |
|
elif (( CURRENT > 2 ));then |
|
case "$words[2]" in |
|
unmerge|-C) |
|
if compset -P '(\\|)[><][=]'; then |
|
_arguments -s \ |
|
'*:installed pkgname with versions:_portage_unmerge_vers' "$common_args[@]" && return 0 |
|
elif compset -P '(\\|)[<=>]'; then |
|
_arguments -s \ |
|
'*:installed pkgname with versions:_portage_unmerge_vers' "$common_args[@]" && return 0 |
|
else |
|
_arguments -s \ |
|
'*:installed pkgname:_portage_unmerge' "$common_args[@]" && return 0 |
|
fi |
|
;; |
|
clean|-c) |
|
_arguments -s \ |
|
'*:installed pkgname:_portage_clean' "$common_args[@]" && return 0 |
|
;; |
|
--usepkgonly|-K) |
|
_arguments -s \ |
|
'*:use package only:_portage_tbz2list' "$common_args[@]" && return 0 |
|
;; |
|
depclean|help|-h|info|regen|sync|rsync|--searchdesc|-S|search|-s|prune|-P) |
|
;; |
|
--resume|--skipfirst) |
|
_arguments -s \ |
|
'--skipfirst[Removes the first package in the resume list]' \ |
|
"$common_args[@]" && return 0 |
|
;; |
|
*) |
|
_arguments -s \ |
|
'*:*:->install_portage' \ |
|
"$common_args[@]" \ |
|
"$install_args[@]" && return 0 |
|
;; |
|
esac |
|
fi |
|
while [[ -n "$state" ]]; do |
|
lstate=$state |
|
state='' |
|
case "$lstate" in |
|
actions) |
|
if compset -P '(\\|)[><][=]'; then |
|
_alternative \ |
|
'*:portage:_ebuild_cache' |
|
|
|
elif compset -P '(\\|)[<=>]'; then |
|
_alternative \ |
|
'*:portage:_ebuild_cache' |
|
|
|
else |
|
_alternative \ |
|
':emerge actions:_actions' \ |
|
'*:portage:_portage_pkglist' |
|
fi |
|
|
|
;; |
|
install_portage) |
|
if compset -P '(\\|)[><][=]'; then |
|
_alternative \ |
|
'*:portage:_ebuild_cache' |
|
elif compset -P '(\\|)[<=>]'; then |
|
_alternative \ |
|
'*:portage:_ebuild_cache' |
|
else |
|
_alternative \ |
|
'*:portage:_portage_pkglist' |
|
fi |
|
;; |
|
esac |
|
done |
|
} |
|
|
|
#Function to show only installed packages -- pkgname (no category or version #) |
|
_portage_unmerge(){ |
|
installed_portage=(/var/db/pkg/*-*/*) |
|
installed_pkgname=${(M)${${installed_portage##*/}%%-[0-9]*}} |
|
_tags -s installed_pkgname && { compadd "$@" ${(kv)=installed_pkgname} } |
|
_path_files -/ -W "/var/db/pkg/" |
|
} |
|
| |
#Function to show only installed packages -- no _path_files |
noask_opts=(-p -a --pretend --ask --regen --info --search -s --searchdesc \ |
_portage_quickpkg(){ |
-S --version -V --help -h --metadata) |
installed_portage=(/var/db/pkg/*-*/*) |
|
installed_pkgname=${(M)${${installed_portage##*/}%%-[0-9]*}} |
|
_tags -s installed_pkgname && { compadd "$@" ${(kv)=installed_pkgname} } |
|
} |
|
|
|
#Function to show only installed packages -- cat/name-ver |
|
_portage_unmerge_vers(){ |
|
installed_portage=(/var/db/pkg/*-*/*) |
|
installed_pkgname=${(M)${${installed_portage##*/}}} |
|
_tags -s installed_pkgname && { compadd "$@" ${(kv)=installed_pkgname} } |
|
_path_files -/ -W "/var/db/pkg/" |
|
} |
|
| |
#Functions to show "cat/name", classes and dependencies |
nopkg_opts=(--resume --skipfirst -c --clean -h --help --depclean --info \ |
_portage_clean() { |
--metadata -P --prune --regen -s --search -S --searchdesc --sync -C \ |
installed_portage=(/var/db/pkg/*-*/*) |
--unmerge -V --version -i --inject) |
installed_dir=/var/db/pkg/ |
|
installed_pkg=${installed_portage//$installed_dir/} |
bopts=($nopkg_opts -b --buildpkg -B --buildpkgonly -G --getbinpkgonly -g \ |
installed_pkgname=${(M)${${installed_portage##*/}%%-[0-9]*}} |
--getbinpkg -k --usepkg -K --usepkgonly --fetch-all-uri -f -F --fetchonly) |
_tags -s installed_pkg && { compadd "$@" -k installed_pkg || compadd "$@" ${(kv)=installed_pkg} } |
|
_tags -s installed_pkgname && { compadd "$@" -k installed_pkgname || compadd "$@" ${(kv)=installed_pkgname} } |
all=($bopts -l --changelog --columns --deep -D --emptytree -e --newuse \ |
} |
--noconfmem --nodeps -O --noreplace -n --oneshot -1 -o --onlydeps --tree -t \ |
|
-u --update -U --upgradeonly) |
#Function to show tbz2 files available |
|
_portage_tbz2list() { |
common_args=( |
# this doesn't take care of ${PORTAGE_BINHOST}. If Gentoo official |
"($noask_opts --sync)"{-p,--pretend}"[Simply display what would be done]" |
# binary mirror will be available we should rewrite it accordingly. |
"($noask_opts)"{-a,--ask}"[Ask what would be done]" |
_path_files -g \*.tbz2 -W "${pkgdir}/All" |
'(-d --debug --help -h --version -V)'{-d,--debug}'[Tells emerge to run the emerge command in debug mode]' |
} |
'(--quiet -q --verbose -v)'{-q,--quiet}'[General outcome is a reduced or condensed output]' |
|
'(--verbose -v --quiet -q)'{-v,--verbose}'[Tell emerge to run in verbose mode]' |
|
'--nospinner[Disables the spinner for the session]' |
|
) |
|
install_args=( |
|
"($bopts)"{-b,--buildpkg}"[Tells emerge to build binary packages]" |
|
"($bopts)"{-B,--buildpkgonly}"[Tells emerge to only build binary packages]" |
|
"($nopkg_opts --emptytree -e -l --changelog --usepkgonly -K)"{-l,--changelog}"[This will show the ChangeLog]" |
|
"($nopkg_opts -t --tree)--columns[Displays versions in aligned format]" |
|
"($nopkg_opts -D --deep)"{-D,--deep}"[Consider the entire dependency tree of packages]" |
|
"($nopkg_opts -e -l --changelog --emptytree)"{-e,--emptytree}"[Only consider glibc as installed packages]" |
|
"($all --nospinner --pretend -p)"{-i,--inject}"[Portage thinks that this package is installed]" |
|
"($nopkg_opts $bopts)"{-f,--fetchonly}"[Just perform fetches for all packages]" |
|
"($nopkg_opts $bopts)"{-F,--fetch-all-uri}"[As -f, but prints all mirrors when used with -p]" |
|
"($bopts)"{-g,--getbinpkg}"[Tells emerge to download binary package]" |
|
"($bopts)"{-G,--getbinpkgonly}"[As --getbinpkg, but does not use local info]" |
|
"($nopkg_opts)--noconfmem[Causes portage to disregard merge records]" |
|
"($nopkg_opts -O --nodeps)"{-O,--nodeps}"[Merges specified packages without merging dependencies]" |
|
"($nopkg_opts -n --noreplace)"{-n,--noreplace}"[Skip packages already installed]" |
|
"($nopkg_opts)"{-1,--oneshot}"[Do not add package to the world profile]" |
|
"($nopkg_opts --onlydeps -o)"{-o,--onlydeps}"[Only merge (or pretend to merge) the dependencies]" |
|
"($nopkg_opts --columns -t --tree)"{-t,--tree}"[Show dependency tree]" |
|
"($nopkg_opts --update -u)"{-u,--update}"[Updates packages to the most recent version available]" |
|
"($nopkg_opts --upgradeonly -U)"{-U,--upgradeonly}"[Do not update packages to a lower version]" |
|
"($bopts)"{-k,--usepkg}"[Tells emerge to use binary packages if available]" |
|
"($bopts --changelog -l)"{-K,--usepkgonly}"[Tells emerge to use binary packages only]" |
|
"($all)"{-c,--clean}"[Cleans the system by removing packages]" |
|
'(: -)'{-h,--help}'[Displays help]:subject:(sync config system)' |
|
"(: $all)--depclean[Clean all packages that have no reason for being installed]" |
|
"(: $all $noask_opts --nospinner --quiet -q)--info[This is a list of information to include in bug reports]" |
|
"(: -)--metadata[Generate metadata]" |
|
"($nopkg_opts --usepkgonly -K)--newuse[Include installed packages which have changed USE flags]" |
|
"($all)"{-P,--prune}"[Removes all but the latest versions of matching packages]" |
|
"(: $all $noask_opts --verbose -v)--regen[Causes portage to check and update the dependency cache]" |
|
"(: $all $noask_opts --verbose -v)"{-s,--search}"[Searches for matches]" |
|
"(: $all $noask_opts --verbose -v)"{-S,--searchdesc}"[Matches the seachdesc string against the description field]" |
|
"(: $all --pretend -p)--sync[Initiates a portage tree update]" |
|
"($all)"{-C,--unmerge}"[Removes all matching packages]" |
|
'(: -)'{-V,--version}'[Display version info]' |
|
"(: $all[3,-1])--resume[Resumes the last merge operation]" |
|
"(: $all[3,-1])--skipfirst[Removes the first package in the resume list]" |
|
) |
|
profiles=( |
|
'world[All packages in the world profile]' |
|
'system[All packages in the system profile]' |
|
) |
|
|
|
|
|
# Dispatch |
|
if (( $words[(I)(--(unmerge|clean|prune)|-[[:alpha:]]#(C|c|P)[[:alpha:]]#)] )) ; then |
|
if compset -P '(\\|)(>=|<=|<|>|=)'; then |
|
_arguments -s \ |
|
'*:installed package:_gentoo_packages installed_versions' && return 0 |
|
else |
|
_arguments -s \ |
|
"$common_args[@]" "$install_args[@]" \ |
|
"*:installed package:_gentoo_packages installed" && return 0 |
|
fi |
| |
#Function to show all available portage names |
elif (( $words[(I)(world|system)] )) ; then |
_portage_pkglist(){ |
_arguments -s \ |
portage_classlist="world system" |
"$common_args[@]" "$install_args[@]" \ |
portage_pkglist="$portage_pkglist ${portage_classlist}" |
"($nopkg_opts[1,-2] --inject -i --oneshot -1):" && return 0 |
_tags -s portage_pkglist && { compadd "$@" -k portage_pkglist || compadd "$@" ${(kv)=portage_pkglist} } |
|
_path_files -/ -W "${portdir}" |
elif (( $words[(I)(--usepkgonly|-[[:alnum:]]#K[[:alnum:]]#)] )) ; then |
# XXX: If I add ${portdir_overlay} category completion won't work properly |
_arguments -s \ |
#[[ -n "${portdir_overlay}" ]] && _path_files -/ -W "${portdir_overlay}" |
"$common_args[@]" "$install_args[@]" \ |
_path_files -g \*.ebuild |
'*:binary package:_gentoo_packages binary' && return 0 |
|
|
|
elif [[ $words[-3] == (--help|-h) ]] ; then |
|
_message "No more arguments" && return 0 |
|
|
|
else |
|
if compset -P '(\\|)(>=|<=|<|>|=)'; then |
|
_arguments \ |
|
"*:portage:_gentoo_packages available_versions" && return 0 |
|
|
|
elif (( $words[(I)(--inject|-i)] )) ; then |
|
_arguments -s \ |
|
"$common_args[@]" "$install_args[@]" \ |
|
"*:portage:_gentoo_packages available_versions" && return 0 |
|
else |
|
_arguments -s \ |
|
"$common_args[@]" "$install_args[@]" \ |
|
"($nopkg_opts)::portage: _values 'profile' \$profiles[@] " \ |
|
"($nopkg_opts)*:portage:_gentoo_packages available" && return 0 |
|
fi |
|
fi |
} | } |
#Function for matching all ebuilds pkg-ver (slow if asking for all packages) |
|
_ebuild_cache(){ |
|
if _cache_invalid portage_ebuilds || ! _retrieve_cache portage_ebuilds; then |
|
|
|
overlay_ebuilds=($portdir_overlay/*-*/*/*) |
|
overlay_list=${${(M)${overlay_ebuilds##*/}#*ebuild}%%.ebuild} |
|
metadata_ebuilds=($portdir/metadata/cache/*-*/*) |
|
metadata_list=${(M)${${metadata_ebuilds##*/}}} |
|
| |
_store_cache portage_ebuilds metadata_list overlay_list |
|
fi |
|
_tags -s metadata_list && {compadd "$@" ${(kv)=metadata_list} } |
|
_tags -s overlay_list && {compadd "$@" ${(kv)=overlay_list} } |
|
} |
|
| |
local update_policy |
|
zstyle -s ":completion:*:*:emerge:*" cache-policy update_policy |
|
if [[ -z "$update_policy" ]]; then |
|
zstyle ":completion:*:*:emerge:*" cache-policy _ebuilds_caching_policy |
|
fi |
|
|
|
_ebuilds_caching_policy () { |
|
# rebuild if cache is more than a week old |
|
oldp=( "$1"(mw+1) ) |
|
(( $#oldp )) && return 0 |
|
} |
|
| |
common_args=( |
local gentoo_runlevels |
{'(-p -a --ask)--pretend','(--pretend -a --ask)-p'}'[simply display what would be done]' |
gentoo_runlevels=(/etc/runlevels/*(:t)) |
{'(-p -a --pretend)--ask','(--pretend -p --ask)-a'}'[ask what would be done]' |
|
{'(-d)--debug','(--debug)-d'}'[Tells emerge to run the emerge command in debug mode]' |
|
) |
|
install_args=( |
|
{'(--upgradeonly -U --update -u --quiet -q --onlydeps -o --oneshot --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --changelog --buildpkg -B -b --buildpkgonly --emptytree -e -f --fetchonly)-l','(--upgradeonly -U --update -u --quiet -q --onlydeps -o --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --emptytree -e -f --fetchonly -l --buildpkg -b -B --buildpkgonly )--changelog'}'[This will show the ChangeLog]' |
|
{'(-b --buildpkgonly -B --changelog -l)--buildpkg','(--changelog -l --buildpkg --buildpkgonly -B)-b'}'[Tells emerge to build binary packages]' |
|
{'(-B -b --buildpkg --changelog -l)--buildpkgonly','(--changelog -l --buildpkgonly --buildpkg -b)-B'}'[Tells emerge to only build binary packages]' |
|
{'(-D --changelog -l)--deep','(-l --changelog --deep)-D'}'[Consider the entire dependency tree of packages]' |
|
{'(-e -l --changelog)--emptytree','(--emptytree -l --changelog)-e'}'[Only consider glibc as installed packages]' |
|
{'(-f -l --changelog)--fetchonly','(-l --changelog --fetchonly)-f'}'[Just perform fetches for all packages]' |
|
'(-l --changelog)--noconfmem[Causes portage to disregard merge records]' |
|
{'(--changelog -l -O)--nodeps','(--nodeps --changelog -l)-O'}'[Merges specified packages without merging dependencies]' |
|
{'(-l --changelog -n)--noreplace','(-l --changelog --noreplace)-n'}'[Skip packages already installed]' |
|
'(-l --changelog)--nospiner[Disables the spinner for the session]' |
|
'(-l --changelog)--oneshot[Do not add package to the world profile]' |
|
{'(--onlydeps --changelog -l)-o','(--changelog -o -l)--onlydeps'}'[Only merge (or pretend to merge) the dependencies]' |
|
{'(--quiet --changelog -l)-q','(-q --changelog -l)--quiet'}'[General outcome is a reduced or condensed output]' |
|
{'(-l --changelog -t)--tree','(-l --changelog --tree)-t'}'[Show dependency tree]' |
|
{'(--update --changelog -l)-u','(-u --changelog -l)--update'}'[Updates packages to the most recent version available]' |
|
{'(--upgradeonly --changelog -l)-U','(-U --changelog -l)--upgradeonly'}'[Do not update packages to a lower version]' |
|
{'(--usepkg --changelog -l)-k','(-k --changelog -l)--usepkg'}'[Tells emerge to use binary packages if available]' |
|
{'(--usepkgonly --changelog -l)-K','(-K --changelog -l)--usepkgonly'}'[Tells emerge to use binary packages only]' |
|
{'(--verbose)-v','(-v)--verbose'}'[Tell emerge to run in verbose mode]' |
|
'(-p --pretend -a --ask)--columns[Displays versions in aligned format]' |
|
'--resume[Resumes the last merge operation]' |
|
) |
|
|
|
_actions() { |
|
_values "emerge actions" \ |
|
'sync[Initiates a portage tree update]' \ |
|
'rsync[Initiates a portage tree update]' \ |
|
'unmerge[Removes all matching packages]' \ |
|
'search[Searches for matches]' \ |
|
'regen[Causes portage to check and update the dependency cache]' \ |
|
'prune[Removes all but the latest versions of matching packages]' \ |
|
'inject[Portage thinks that this package is installed]' \ |
|
'info[This is a list of information to include in bug reports]' \ |
|
'help[Displays help]' \ |
|
'depclean[Clean all packages that have no reason for being installed]'\ |
|
'clean[Cleans the system by removing packages]' \ |
|
'-c[Cleans the system by removing packages]' \ |
|
'-h[Displays help]' \ |
|
'-i[Portage thinks that this package is installed]' \ |
|
'-P[Removes all but the latest versions of matching packages]' \ |
|
'-s[Searches for matches]' \ |
|
'-S[Matches the search string against the description field]' \ |
|
'--searchdesc[Matches the search string against the description field]' \ |
|
'-C[Removes all matching packages]' \ |
|
'world[Represent all packages in the world profiles]' \ |
|
'system[Represent all the system packages]' |
|
} |
|
local portage_pkglist gentoo_runlevels portdir pkgdir portdir_overlay overlay |
|
#Reading informations from make.conf |
|
[[ -n "${PORTDIR}" ]] && portdir="${PORTDIR}" |
|
[[ -n "${PKGDIR}" ]] && pkgdir="${PKGDIR}" |
|
if [[ -n "${PORTDIR_OVERLAY}" ]] ; then |
|
for overlay in ${=PORTDIR_OVERLAY} ; do |
|
portdir_overlay=(${overlay} ${portdir_overlay}) |
|
done |
|
fi |
|
[[ -r /etc/make.globals ]] && source /etc/make.globals |
|
[[ -r /etc/make.conf ]] && source /etc/make.conf |
|
|
|
[[ -z "${portdir}" ]] && portdir="${PORTDIR}" |
|
[[ -z "${pkgdir}" ]] && pkgdir="${PKGDIR}" |
|
if [[ -z "${portdir_overlay}" ]] ; then |
|
for overlay in ${=PORTDIR_OVERLAY} ; do |
|
portdir_overlay=(${overlay} ${portdir_overlay}) |
|
done |
|
fi |
|
|
|
portage_pkglist=(${portdir}/*-*/* ${portdir_overlay}/*-*/*) |
|
portage_pkglist=(${portage_pkglist##*/}) |
|
gentoo_runlevels=(/etc/runlevels/*) |
|
gentoo_runlevels=(${${gentoo_runlevels/\/etc\/runlevels\//}%/}) |
|
| |
case "$service" in | case "$service" in |
emerge) | emerge) |