mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-19 21:44:11 +01:00
71 lines
1.4 KiB
Plaintext
71 lines
1.4 KiB
Plaintext
#autoload
|
|
|
|
local tags def expl descr action mesgs nm="$compstack[nmatches]"
|
|
local context
|
|
|
|
if [[ "$1" = -C?* ]]; then
|
|
context="${1[3,-1]}"
|
|
shift
|
|
elif [[ "$1" = -C ]]; then
|
|
context="$2"
|
|
shift 2
|
|
fi
|
|
|
|
mesgs=()
|
|
|
|
_tags -C "$context" "${(@)argv%%:*}"
|
|
|
|
while _tags; do
|
|
for def; do
|
|
if _requested "${def%%:*}"; then
|
|
descr="${${def#*:}%%:*}"
|
|
action="${def#*:*:}"
|
|
|
|
_description expl "$descr"
|
|
|
|
if [[ "$action" = \ # ]]; then
|
|
|
|
# An empty action means that we should just display a message.
|
|
|
|
mesgs=( "$mesgs[@]" "$descr")
|
|
elif [[ "$action" = \(\(*\)\) ]]; then
|
|
local ws
|
|
|
|
# ((...)) contains literal strings with descriptions.
|
|
|
|
eval ws\=\( "${action[3,-3]}" \)
|
|
|
|
_describe "$descr" ws -M 'r:|[_-]=* r:|=*'
|
|
elif [[ "$action" = \(*\) ]]; then
|
|
|
|
# Anything inside `(...)' is added directly.
|
|
|
|
compadd "$expl[@]" - ${=action[2,-2]}
|
|
elif [[ "$action" = \{*\} ]]; then
|
|
|
|
# A string in braces is evaluated.
|
|
|
|
eval "$action[2,-2]"
|
|
elif [[ "$action" = \ * ]]; then
|
|
|
|
# If the action starts with a space, we just call it.
|
|
|
|
${(e)=~action}
|
|
else
|
|
|
|
# Otherwise we call it with the description-arguments built above.
|
|
|
|
action=( $=action )
|
|
${(e)action[1]} "$expl[@]" ${(e)~action[2,-1]}
|
|
fi
|
|
fi
|
|
done
|
|
[[ nm -ne compstate[nmatches] ]] && return 0
|
|
done
|
|
|
|
for descr in "$mesgs[@]"; do
|
|
_message "$descr"
|
|
done
|
|
|
|
return 1
|