mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-31 18:10:56 +01:00
86 lines
2 KiB
Text
86 lines
2 KiB
Text
#autoload
|
|
|
|
local all ret=1 end xor has_args had_args ostate ocontext oopt_args r
|
|
local nm="$compstate[nmatches]"
|
|
local opre="$PREFIX" oipre="$IPREFIX" ocur="$CURRENT"
|
|
local osuf="$SUFFIX" oisuf="$ISUFFIX" owords
|
|
local _ms_match _ms_opt _ms_soptmid _ms_soptmidadd _ms_soptend
|
|
local _ms_optnext _ms_optdirect _ms_optequal
|
|
|
|
_ms_soptmid=()
|
|
_ms_soptmidadd=()
|
|
_ms_soptend=()
|
|
_ms_optnext=()
|
|
_ms_optdirect=()
|
|
_ms_optequal=()
|
|
|
|
owords=("$words[@]")
|
|
|
|
end=$argv[(i)-]
|
|
[[ end -gt $# ]] && return 1
|
|
|
|
all=( "${(@)argv[1,end]}" )
|
|
|
|
shift end
|
|
|
|
xor=()
|
|
ostate=()
|
|
ocontext=()
|
|
oopt_args=()
|
|
|
|
while true; do
|
|
end=$argv[(i)-]
|
|
|
|
if [[ "$1" = \(*\) ]]; then
|
|
_arguments -m xor "${1[2,-2]}" "$all[@]" \
|
|
"$1${(@)^argv[2,end-1]:#\(*}" \
|
|
"${1[1,-2]} ${(@)${(@M)^argv[2,end-1]:#\(*}#?}"
|
|
else
|
|
_arguments -m xor "$1" "$all[@]" "${(@)argv[2,end-1]}"
|
|
fi
|
|
|
|
r=$?
|
|
|
|
oopt_args=( "$oopt_args[@]" "${(@kv)opt_args}" )
|
|
if [[ r -eq 300 ]]; then
|
|
ret=300
|
|
ostate=( "$ostate[@]" "$state[@]" )
|
|
ocontext=( "$ocontext[@]" "$context[@]" )
|
|
PREFIX="$opre" SUFFIX="$osuf"
|
|
IPREFIX="$oipre" ISUFFIX="$oisuf"
|
|
CURRENT="$ocur" words=( "$owords[@]" )
|
|
elif [[ "$r$ret" = 01 ]]; then
|
|
ret=0
|
|
fi
|
|
|
|
[[ end -gt $# ]] && break
|
|
|
|
shift end
|
|
done
|
|
|
|
[[ -n "$_ms_opt" ]] &&
|
|
{ ! zstyle -T ":completion:${curcontext}:options" prefix-needed ||
|
|
[[ "$PREFIX" = [-+]* ||
|
|
( -z "$has_args" && ret -ne 300 && nm -eq compstate[nmatches] ) ]] } &&
|
|
has_args=yes &&
|
|
_describe -o option \
|
|
_ms_soptmid _ms_soptmidadd -Q -S '' -- \
|
|
_ms_soptend -Q -- \
|
|
_ms_optnext -Q -M "$_ms_match" -- \
|
|
_ms_optdirect -QS '' -M "$_ms_match" -- \
|
|
_ms_optequal -QqS= -M "$_ms_match" && [[ ret -eq 1 ]] && ret=0
|
|
|
|
opt_args=( "$oopt_args[@]" )
|
|
|
|
if [[ ret -eq 300 ]]; then
|
|
state=( "$ostate[@]" )
|
|
context=( "$ocontext[@]" )
|
|
elif [[ -z "$has_args" ]]; then
|
|
if [[ -n "$had_args" ]]; then
|
|
_message "no more arguments"
|
|
else
|
|
_message "no arguments"
|
|
fi
|
|
fi
|
|
|
|
return ret
|