summaryrefslogtreecommitdiff
path: root/Completion
diff options
context:
space:
mode:
Diffstat (limited to 'Completion')
-rw-r--r--Completion/Base/_argument_sets32
-rw-r--r--Completion/Base/_arguments33
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"