1
0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-09-21 19:31:50 +02:00

Initial revision

This commit is contained in:
Tanaka Akira 1999-09-06 09:04:47 +00:00
parent 4a34edc485
commit 4a198fed6e
2 changed files with 291 additions and 0 deletions

76
Completion/Core/_display Normal file
View File

@ -0,0 +1,76 @@
#autoload
# This builds a display-list for the `-y' option of `compadd' and
# `compgen' out of the arguments it gets. The first argument is
# taken as the name of a parameter and the string built is stored
# into it.
# The second argument is the name of an array whose elements each
# contains a string to complete, optionally followed by a colon
# and a description. The display list created will contain one
# line per string with the description after it, all nicely
# aligned. Strings without descriptions are put at the end in a
# column-oriented fashion.
# All arguments after the second one are given as arguments to
# `compadd'.
# This function will also do the matching required to find out
# which strings will be included in the list. All elements that
# don't match will be removed from the array. This means that the
# special parameters `PREFI' and `SUFFIX' have to be set up
# correctly before this function is called.
local _param="$1" _arr _len _i _tmp _simple
# Remove all descriptions not matched by the string on the line.
if [[ "${2[1]}" = \( ]]; then
_arr=( ${(o)=2[2,-2]} )
else
_arr=( "${(@Po)2}" )
fi
compadd -D _arr "${(@)argv[3,-1]}" - "${(@)_arr%%:*}"
[[ "${2[1]}" != \( ]] && eval "${2}=( \"\$_arr[@]\" )"
if (( $#_arr )); then
# There are strings left, first get the length of the longest of
# them (to be able to align them) and collect all strings without
# descriptions.
_simple=()
_len=1
for _i in "$_arr[@]"; do
_tmp="${#_i%%:*}"
if [[ "$_i" = *:?* ]]; then
[[ _tmp -gt _len ]] && _len="$_tmp"
else
_simple=( "$_simple[@]" "${_i%:}" )
fi
done
# Now we build the list in `_tmp', adding one line per string.
_tmp=''
for _i in "$_arr[@]"; do
[[ "$_i" = *:?* ]] && _tmp="$_tmp
${(r:_len:: :)_i%%:*} -- ${_i#*:}"
done
# If there were strings without descriptions, we just add them by
# calling `print -c'.
(( $#_simple )) && _tmp="${_tmp}
$(print -c - $_simple)"
eval "${_param}=${(q)_tmp[2,-1]}"
return 0
else
# None of the strings matches what's on the line, signal this by
# setting the parameter to an empty string and by the return value.
eval "${_param}=''"
return 1
fi

215
Completion/Linux/_rpm Normal file
View File

@ -0,0 +1,215 @@
#compdef rpm
# This uses `_arguments' in a state-machine kind of way. These states
# have names and before executing the default action for such a state
# we try to call a function with the name `_rpm_<state>'. If such a
# function exists, we return with it's return status immediatly. This
# allows users to override the default completions by simply defining
# these functions.
# The states (and possible values for the `<state>' above) are:
#
# query
# complete for `rpm -q' query
# verify
# complete for `rpm --verify'
# install
# complete for `rpm -i' or `rpm --install'
# upgrade
# complete for `rpm -U' or `rpm --upgrade'
# uninstall
# complete for `rpm -e' or `rpm --erase'
# build_b
# complete for `rpm -bx' (the stage `x' is already completed)
# build_t
# complete for `rpm -tx' (the stage `x' is already completed)
# sigcheck
# complete for `rpm --sigcheck'
# rebuild
# complete for `rpm --rebuild'
# package
# complete a RPM package name
# package_file
# complete a RPM package file name
# package_or_file
# the previous two together
# tags
# complete a tag name
# capability
# complete a capability
# relocate
# complete a `old=new' pair of paths
local ret=1 tmp expl
# Used by `_arguments', made local here.
local state lstate line
tyeset -A options
state=''
# Do simple completions or get the first state.
_arguments \
'--rcfile:resource file:_files' \
'--ftpproxy:FTP proxy server:_hosts' \
'--ftpport:FTP port number:' \
'-q:*:query:->query' \
-{V,v,vv,y,-{setperms,setugids,querytags,initdb,showrc}} \
'-pipe:*:pipe command:_command_names -e' \
'--verify:*:verify:->verify' \
-{i,-install}':*:install:->install' \
-{U,-upgrade}':*:upgrade:->upgrade' \
-{e,-erase}':*:uninstall:->uninstall' \
-'b+:build stage:((p\:execute\ \%prep\ stage l\:do\ a\ list\ check c\:execute\ build\ stage i\:execute\ install\ stage b\:build\ a\ binary\ package a\:build\ binary\ and\ source\ packages)):*:build:->build_b' \
-'t+:build stage:((p\:execute\ \%prep\ stage l\:do\ a\ list\ check c\:execute\ build\ stage i\:execute\ install\ stage b\:build\ a\ binary\ package a\:build\ binary\ and\ source\ packages)):*:build:->build_t' \
--{rebuild,rmsource,recompile,resign,addsign}':*:RPM package:->package' \
-{K,-checksig}':*:sigcheck:->sigcheck' \
'--rebuilddb:*:rebuild:->rebuild' && ret=0
# As long as we have a state name...
while [[ -n "$state" ]]; do
# First try to call a user-defined function.
funcall ret _rpm_$state && return ret
# Copy the state and reset `state', to simplify the test above.
lstate="$state"
state=''
tmp=()
# Dispatch...
case "$lstate" in
query)
_arguments \
-{v,vv} \
'--rcfile:resource file:_files' \
'--ftpproxy:FTP proxy server:_hosts' \
'--ftpport:FTP port number:' \
'--root:RPM root directory:_files -/' \
'--dbpath:RPM database path:_files -/' \
'--queryformat:RPM query format:->tags' \
'-f:file:_files' \
'-p:RPM package file:->package_file' \
'--triggeredby:RPM package:->package' \
'--whatprovides:RPM capability:->capability' \
'--whatrequires:RPM capability:->capability' \
'*:RPM package:->package_or_file' && ret=0
;;
verify)
_arguments \
-{v,vv} \
'--rcfile:resource file:_files' \
'--ftpproxy:FTP proxy server:_hosts' \
'--ftpport:FTP port number:' \
--no{deps,md5,files} \
'--root:RPM root directory:_files -/' \
'--dbpath:RPM database path:_files -/' \
'*:RPM package:->package' && ret=0
;;
upgrade)
tmp=( --oldpackage )
;&
install)
_arguments "$tmp[@]" \
-{v,vv} \
'--rcfile:resource file:_files' \
'--ftpproxy:FTP proxy server:_hosts' \
'--ftpport:FTP port number:' \
-{-{badreloc,excludedocs,force,hash,allfiles,ignorearch,ignoreos,includedocs,justdb,nodeps,noorder,noscripts,notriggers,percent,replacefiles,replacepkgs,test},h} \
'--relocate:relocate:->relocate' \
'--prefix:package prefix directory:_files -/' \
'--root:RPM root directory:_files -/' \
'--dbpath:RPM database path:_files -/' \
'*:pkg file:->package_file' && ret=0
;;
uninstall)
_arguments \
-{v,vv} \
'--rcfile:resource file:_files' \
'--ftpproxy:FTP proxy server:_hosts' \
'--ftpport:FTP port number:' \
--{allmatches,justdb,nodeps,noorder,noscripts,notriggers} \
'--root:RPM root directory:_files -/' \
'--dbpath:RPM database path:_files -/' \
'*:RPM package:->package' && ret=0
;;
build_b)
tmp=( '*:RPM package:->package' )
;&
build_t)
(( $#tmp )) || tmp=( '*:tar file:_files -g \*.\(\#i\)tar\(.\*\|\)' )
_arguments \
-{v,vv} \
'--rcfile:resource file:_files' \
'--ftpproxy:FTP proxy server:_hosts' \
'--ftpport:FTP port number:' \
--{short-circuit,clean,rmsource,sign,test} \
'--buildroot:build root directory:_files -/' \
'--buildarch:architecture for which to build:' \
'--buildos:ositecture for which to build:' \
'--timecheck:time check (seconds):' "$tmp[1]" && ret=0
;;
sigcheck)
_arguments \
-{v,vv} \
'--rcfile:resource file:_files' \
'--ftpproxy:FTP proxy server:_hosts' \
'--ftpport:FTP port number:' \
--no{pgp,md5} \
'*:RPM package file:->package_or_file' && ret=0
;;
rebuild)
_arguments \
-{v,vv} \
'--rcfile:resource file:_files' \
'--ftpproxy:FTP proxy server:_hosts' \
'--ftpport:FTP port number:' \
'--root:RPM root directory:_files -/' \
'--dbpath:RPM database path:_files -/' \
'*:RPM source package file:->package_file' && ret=0
;;
package_or_file)
state=package_file
;&
package)
_description expl 'RPM package'
compadd "$expl[@]" -M 'r:|-=* r:|=*' - $(rpm -qa) && ret=0
;;
package_file)
if compset -P ftp:; then
_hosts -S/ && ret=0
else
_files -g '*.(#i)rpm' && ret=0
fi
;;
tags)
if compset -P '*\{'; then
_description expl 'RPM tag'
compadd "$expl[@]" -M 'm:{a-z}={A-Z}' -S '}' - \
"${(@)${(@f)$(rpm --querytags)}#RPMTAG_}" && ret=0
else
_message 'RPM format'
fi
;;
capability)
_message 'RPM capability'
;;
relocate)
if compset -P '*\='; then
_description expl 'new path'
else
_description expl 'old path'
fi
_files "$expl[@]" -/ && ret=0
;;
esac
done
return ret