mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-11-01 06:20:55 +01:00
Initial revision
This commit is contained in:
parent
ef92e77058
commit
02e8fc1a27
3 changed files with 124 additions and 0 deletions
70
Completion/Core/_alternative
Normal file
70
Completion/Core/_alternative
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
#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
|
||||
9
Completion/Core/_requested
Normal file
9
Completion/Core/_requested
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
#autoload
|
||||
|
||||
local tag tname="$funcstack[2,-1]"
|
||||
|
||||
for tag; do
|
||||
[[ "${_cur_tags[${tname}]}" = *:${tag}(:|\[*\]:)* ]] && return 0
|
||||
done
|
||||
|
||||
return 1
|
||||
45
Completion/Core/_style
Normal file
45
Completion/Core/_style
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
#autoload
|
||||
|
||||
local tags get i
|
||||
|
||||
if [[ "$1" = -g ]]; then
|
||||
get=yes
|
||||
shift
|
||||
fi
|
||||
|
||||
if (( ${+_cur_tags[${funcstack[2,-1]}]} )); then
|
||||
tags="${_cur_tags[${funcstack[2,-1]}]}"
|
||||
else
|
||||
tags="${_cur_tags[${funcstack[3,-1]}]}"
|
||||
fi
|
||||
|
||||
if [[ "$tags" = *:${1}\[*\]:* ]]; then
|
||||
|
||||
tags="${${tags#*:${1}\[}%%\]*}"
|
||||
|
||||
if [[ $# -eq 2 ]]; then
|
||||
if [[ -n "$get" ]]; then
|
||||
eval "${2}=\"$tags\""
|
||||
return 0
|
||||
fi
|
||||
|
||||
[[ "$tags" = (|*,)${2}(|,*) ]]
|
||||
return
|
||||
fi
|
||||
|
||||
[[ "$tags" = (|*,)${2}(|(\=|,)*) ]] || return 1
|
||||
|
||||
if [[ -n "$get" ]]; then
|
||||
if [[ "$tags" = (|*,)${2}\=* ]]; then
|
||||
eval "${3}=\"${${tags#(|*,)${2}\=}%%,*}\""
|
||||
else
|
||||
eval "${3}=''"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
[[ "$tags" = (|*,)${2}\=(|[^,]#,)${3}(|,*) ]]
|
||||
return
|
||||
fi
|
||||
|
||||
return 1
|
||||
Loading…
Add table
Add a link
Reference in a new issue