1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
#autoload
local subopts opt usecc garbage
subopts=()
zparseopts -D -E -a garbage C=usecc O:=subopts M: J: V: 1 2 n F: X:
(( $#subopts )) && subopts=( "${(@P)subopts[2]}" )
if compvalues -i "$@"; then
local noargs args opts descr action expl sep argsep subc test='*'
local oldcontext="$curcontext"
compvalues -S argsep
compvalues -s sep && [[ -n "$sep" ]] && test="[^${(q)sep}]#"
if ! compvalues -D descr action; then
_tags values || return 1
curcontext="${oldcontext%:*}:values"
compvalues -V noargs args opts
if [[ -n "$argsep" && "$PREFIX" = *${argsep}${~test} ]]; then
local name
name="${PREFIX%%${argsep}*}"
if compvalues -L "$name" descr action; then
IPREFIX="${IPREFIX}${name}${argsep}"
PREFIX="${PREFIX#*${argsep}}"
else
local prefix suffix
prefix="${PREFIX#*${argsep}}"
suffix="$SUFFIX"
PREFIX="$name"
SUFFIX=''
args=( "$args[@]" "$opts[@]" )
compadd -M 'r:|[_-]=* r:|=*' -D args - "${(@)args[@]%%:*}"
[[ $#args -ne 1 ]] && return 1
PREFIX="$prefix"
SUFFIX="$suffix"
IPREFIX="${IPREFIX}${args[1]%%:*}${argsep}"
compvalues -L "${args[1]%%:*}" descr action subc
curcontext="${oldcontext%:*}:$subc"
fi
else
compvalues -d descr
if [[ ${#noargs}+${#args}+${#opts} -ne 1 ]] && compvalues -s sep; then
sep=( "-qS" "$sep" )
else
sep=()
fi
_describe "$descr" \
noargs "$sep[@]" -M 'r:|[_-]=* r:|=*' -- \
args -S "${argsep}" -M 'r:|[_-]=* r:|=*' -- \
opts -qS "${argsep}" -M 'r:|[_-]=* r:|=*'
curcontext="$oldcontext"
return
fi
else
compvalues -C subc
curcontext="${oldcontext%:*}:$subc"
fi
if ! _tags arguments; then
curcontext="$oldcontext"
return 1
fi
_description arguments expl "$descr"
# We add the separator character as a autoremovable suffix unless
# we have only one possible value left.
sep=()
[[ ${#snames}+${#names}+${#onames} -ne 1 ]] && compvalues -s sep &&
expl=( "-qS$sep" "$expl[@]" ) sep=( "-qS$sep" )
if [[ "$action" = -\>* ]]; then
compvalues -v val_args
state="${${action[3,-1]##[ ]#}%%[ ]#}"
if [[ -n "$usecc" ]]; then
curcontext="${oldcontext%:*}:$subc"
else
context="$subc"
fi
compstate[restore]=''
return 1
else
typeset -A val_args
compvalues -v val_args
if [[ "$action" = \ # ]]; then
# An empty action means that we should just display a message.
_message -e arguments "$descr"
return 1
elif [[ "$action" = \(\(*\)\) ]]; then
local ws
# ((...)) contains literal strings with descriptions.
eval ws\=\( "${action[3,-3]}" \)
_describe "$descr" ws -M 'r:|[_-]=* r:|=*' "$subopts[@]" "$sep[@]"
elif [[ "$action" = \(*\) ]]; then
# Anything inside `(...)' is added directly.
eval ws\=\( "${action[2,-2]}" \)
_all_labels arguments expl "$descr" compadd "$subopts[@]" "$sep[@]" -a - ws
elif [[ "$action" = \{*\} ]]; then
# A string in braces is evaluated.
while _next_label arguments expl "$descr"; do
eval "$action[2,-2]"
done
elif [[ "$action" = \ * ]]; then
# If the action starts with a space, we just call it.
eval "action=( $action )"
while _next_label arguments expl "$descr"; do
"$action[@]"
done
else
# Otherwise we call it with the description-arguments built above.
eval "action=( $action )"
while _next_label arguments expl "$descr"; do
"$action[1]" "$subopts[@]" "$expl[@]" "${(@)action[2,-1]}"
done
fi
fi
curcontext="$oldcontext"
[[ nm -ne "$compstate[nmatches]" ]]
else
curcontext="$oldcontext"
return 1;
fi
|