diff options
Diffstat (limited to 'Completion')
-rw-r--r-- | Completion/Base/_argument_sets | 32 | ||||
-rw-r--r-- | Completion/Base/_arguments | 33 |
2 files changed, 54 insertions, 11 deletions
diff --git a/Completion/Base/_argument_sets b/Completion/Base/_argument_sets index 5218fef69..d9c771051 100644 --- a/Completion/Base/_argument_sets +++ b/Completion/Base/_argument_sets @@ -1,10 +1,20 @@ #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 -owords="$words[@]" +_ms_soptmid=() +_ms_soptmidadd=() +_ms_soptend=() +_ms_optnext=() +_ms_optdirect=() +_ms_optequal=() + +owords=("$words[@]") end=$argv[(i)-] [[ end -gt $# ]] && return 1 @@ -16,14 +26,22 @@ shift end xor=() ostate=() ocontext=() +oopt_args=() while true; do end=$argv[(i)-] - _arguments -m xor "$1" "$all[@]" "${(@)argv[2,end-1]}" + 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}" ) + oopt_args=( "$oopt_args[@]" "${(@kv)opt_args}" ) if [[ r -eq 300 ]]; then ret=300 ostate=( "$ostate[@]" "$state[@]" ) @@ -40,6 +58,14 @@ while true; do shift end done +[[ -n "$_ms_opt" ]] && + _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 diff --git a/Completion/Base/_arguments b/Completion/Base/_arguments index 0637b2cd5..ed7bd98d7 100644 --- a/Completion/Base/_arguments +++ b/Completion/Base/_arguments @@ -163,11 +163,13 @@ done zstyle -s ":completion:${curcontext}:options" auto-description autod if (( $# )) && comparguments "$multi[@]" "$autod" "$@"; then - local nm="$compstate[nmatches]" action noargs aret expl local + local action noargs aret expl local local next direct odirect equal single match matched ws tmp1 tmp2 tmp3 local opts subc tc prefix suffix descrs actions subcs local origpre="$PREFIX" origipre="$IPREFIX" + [[ -z "$ismulti" ]] && local nm="$compstate[nmatches]" + if comparguments -D descrs actions subcs; then if comparguments -O next direct odirect equal; then opts=yes @@ -314,17 +316,32 @@ if (( $# )) && comparguments "$multi[@]" "$autod" "$@"; then tmp1=( "${(M@)tmp1:#[-+]?(|:*)}" ) tmp2=( "${PREFIX}${(@M)^${(@)${(@)tmp1%%:*}#[-+]}:#?}" ) - _describe -o option \ - tmp1 tmp2 -Q -S '' -- \ - tmp3 -Q + if [[ -n "$ismulti" ]]; then + _ms_opt=yes + _ms_soptmid=( "$_ms_soptmid[@]" "$tmp1[@]" ) + _ms_soptmidadd=( "$_ms_soptmidadd[@]" "$tmp2[@]" ) + _ms_soptend=( "$_ms_soptend[@]" "$tmp3[@]" ) + else + _describe -o option \ + tmp1 tmp2 -Q -S '' -- \ + tmp3 -Q + fi fi single=yes else next=( "$next[@]" "$odirect[@]" ) - _describe -o option \ - next -Q -M "$match" -- \ - direct -QS '' -M "$match" -- \ - equal -QqS= -M "$match" + if [[ -n "$ismulti" ]]; then + _ms_opt=yes + _ms_match="$_ms_match $match" + _ms_optnext=( "$_ms_optnext[@]" "$next[@]" ) + _ms_optdirect=( "$_ms_optdirect[@]" "$direct[@]" ) + _ms_optequal=( "$_ms_optequal[@]" "$equal[@]" ) + else + _describe -o option \ + next -Q -M "$match" -- \ + direct -QS '' -M "$match" -- \ + equal -QqS= -M "$match" + fi fi PREFIX="$prevpre" IPREFIX="$previpre" |