about summary refs log tree commit diff
path: root/Completion/Base
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Base')
-rw-r--r--Completion/Base/_arguments91
1 files changed, 46 insertions, 45 deletions
diff --git a/Completion/Base/_arguments b/Completion/Base/_arguments
index 1c5fa7a1d..3d742f0f9 100644
--- a/Completion/Base/_arguments
+++ b/Completion/Base/_arguments
@@ -6,7 +6,7 @@
 setopt localoptions extendedglob
 
 local long args rest ws cur nth def nm expl descr action opt arg tmp
-local single uns ret=1
+local single uns ret=1 soptseq soptseq1 sopts
 
 # Associative arrays used to collect information about the options.
 
@@ -90,6 +90,22 @@ while (( $# )); do
   shift
 done
 
+if [[ -n "$single" ]]; then
+  soptseq="${(@j::)${(@M)${(@k)opts[(R)]}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)mopts[(R)]}:#[-+]?}#[-+]}"
+  if [[ -n "$soptseq" ]]; then
+    soptseq="[$soptseq]#"
+    soptseq1="$soptseq#"
+  else
+    soptseq=''
+    soptseq1=''
+  fi
+  sopts="${(@j::)${(@M)${(@k)opts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)mopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)dopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)dmopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)odopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)odmopts}:#[-+]?}#[-+]}"
+else
+  soptseq=''
+  soptseq1=''
+  sopts=''
+fi
+
 if [[ $#long -ne 0 && "$PREFIX" = --* ]]; then
 
    # If the current words starts with `--' and we should use long
@@ -157,19 +173,17 @@ else
         def="$mopts[$ws[1]]"
       else
         uns=''
-        if [[ -n "$single" && "$ws[1]" = [-+]* ]]; then
-          if [[ ${#${(kj::)opts[(R)?*]#?}} -ne 0 &&
-                "$ws[1]" = ${ws[1][1]}*[${(kj::)opts[(R)?*]#?}] ]]; then
+        if [[ -n "$sopts" && "$ws[1]" = [-+]${~soptseq}[$sopts] ]]; then
+	  if (( $+opts[${ws[1][1]}${ws[1][-1]}] )); then
 	    def="$opts[${ws[1][1]}${ws[1][-1]}]"
 	    uns="${ws[1][2,-1]}"
 	    opt=''
-	  elif [[ ${#${(kj::)mopts[(R)?*]#?}} -ne 0 &&
-                  "$ws[1]" = ${ws[1][1]}*[${(kj::)mopts[(R)?*]#?}] ]]; then
+	  elif (( $+mopts[${ws[1][1]}${ws[1][-1]}] )); then
 	    def="$mopts[${ws[1][1]}${ws[1][-1]}]"
 	    uns="${ws[1][2,-1]}"
 	    opt=''
 	  fi
-         fi
+        fi
 
         # If the word is none of the simple options, test for those
         # whose first argument has to or may come directly after the
@@ -185,8 +199,8 @@ else
 	  # with one of the option names.
 
 	  while (( $#tmp )); do
-            if [[ -n "$single" ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
 	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
 		break;
 	      fi
@@ -204,7 +218,7 @@ else
 
 	    opt=''
 	    def="$dopts[$tmp[1]]"
-	    [[ -z "$single" ]] && unset "dopts[$tmp[1]]"
+	    unset "dopts[$tmp[1]]"
 	    if [[ "$def" = ?*:*:* ]]; then
               def="${def#?*:*:}"
             else
@@ -215,8 +229,8 @@ else
 	if [[ -n "$opt" && $#dmopts -ne 0 ]]; then
 	  tmp=( "${(@k)dmopts}" )
 	  while (( $#tmp )); do
-            if [[ -n "$single" ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
 	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
 		break;
 	      fi
@@ -239,8 +253,8 @@ else
         if [[ -n "$opt" && $#odopts -ne 0 ]]; then
 	  tmp=( "${(@k)odopts}" )
 	  while (( $#tmp )); do
-            if [[ -n "$single" ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
 	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
 		break;
 	      fi
@@ -253,14 +267,14 @@ else
 	  if (( $#tmp )); then
 	    opt=''
 	    def="$odopts[$tmp[1]]"
-	    [[ -z "$single" ]] && unset "odopts[$tmp[1]]"
+	    unset "odopts[$tmp[1]]"
 
 	    # For options whose first argument *may* come after the
 	    # option, we skip over the first description only if there
 	    # is something after the option name on the line.
 
-	    if [[ ( -z "$single" && "$ws[1]" != "$tmp[1]" ) ||
-                  ( -n "$single" && "$ws[1]" != *${tmp[1][2]} ) ]]; then
+	    if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) ||
+                  ( -n "$sopts" && $tmp[1] = [-+]? && "$ws[1]" != ${tmp[1][1]}${~soptseq}${tmp[1][2]} ) ]]; then
 	      if [[ "$def" = ?*:*:* ]]; then
                 def="${def#?*:*:}"
               else
@@ -272,8 +286,8 @@ else
 	if [[ -n "$opt" && $#odmopts -ne 0 ]]; then
 	  tmp=( "${(@k)odmopts}" )
 	  while (( $#tmp )); do
-            if [[ -n "$single" ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
 	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
 		break;
 	      fi
@@ -286,8 +300,8 @@ else
 	  if (( $#tmp )); then
 	    opt=''
 	    def="$odmopts[$tmp[1]]"
-	    if [[ ( -z "$single" && "$ws[1]" != "$tmp[1]" ) ||
-                  ( -n "$single" && "$ws[1]" != *${tmp[1][2]} ) ]]; then
+	    if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) ||
+                  ( -n "$sopts" && $tmp[1] = [-+]? && "$ws[1]" != ${tmp[1][1]}${~soptseq}${tmp[1][2]} ) ]]; then
 	      if [[ "$def" = ?*:*:* ]]; then
                 def="${def#?*:*:}"
               else
@@ -297,7 +311,7 @@ else
           fi
 	fi
 
-        [[ -n "$single" && -n "$opt" && "$ws[1]" = [-+]* ]] && \
+        [[ -n "$sopts" && -n "$opt" && "$ws[1]" = [-+]${~soptseq} ]] && \
             uns="${ws[1][2,-1]}"
 
         [[ -n "$uns" ]] &&
@@ -351,7 +365,7 @@ else
 
       tmp=( "${(@k)dopts}" )
       while (( $#tmp )); do
-        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+        if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
           def="$dopts[$tmp[1]]"
 	  opt=''
 	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
@@ -371,7 +385,7 @@ else
     if [[ -n "$opt" && $#dmopts -ne 0 ]]; then
       tmp=( "${(@k)dmopts}" )
       while (( $#tmp )); do
-        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+        if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
           def="$dmopts[$tmp[1]]"
 	  opt=''
 	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
@@ -387,7 +401,7 @@ else
     if [[ -n "$opt" && $#odopts -ne 0 ]]; then
       tmp=( "${(@k)odopts}" )
       while (( $#tmp )); do
-        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+        if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
           def="$odopts[$tmp[1]]"
 	  opt=''
 	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
@@ -403,7 +417,7 @@ else
     if [[ -n "$opt" && $#odmopts -ne 0 ]]; then
       tmp=( "${(@k)odmopts}" )
       while (( $#tmp )); do
-        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+        if [[ -n "$sopts" &&  $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
           def="$odmopts[$tmp[1]]"
 	  opt=''
 	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
@@ -417,7 +431,7 @@ else
       done
     fi
 
-    [[ -n "$single" && -n "$opt" && "$PREFIX" = [-+]* ]] && \
+    [[ -n "$sopts" && -n "$opt" && "$PREFIX" = [-+]* ]] && \
         uns="${PREFIX[2,-1]}"
 
     [[ -n "$uns" ]] &&
@@ -433,25 +447,12 @@ else
       if [[ "$compconfig[option_prefix]" != *(short|all)* ||
             "$PREFIX" = [-+]* ]]; then
         _description expl option
-	if [[ -n "$single" ]]; then
-          if [[ -z "$PREFIX" || "$PREFIX" = ? ]]; then
-	    compadd "$expl[@]" - "${(@k)opts}" "${(@k)mopts}" \
-			         "${(@k)dopts}" "${(@k)dmopts}" \
-			         "${(@k)odopts}" "${(@k)odmopts}" &&
-                ret=0
-	  else
-	    compadd "$expl[@]" - "${PREFIX}${(@k)^opts[(I)${PREFIX[1]}*]#?}" \
-			         "${PREFIX}${(@k)^mopts[(I)${PREFIX[1]}*]#?}" \
-			         "${PREFIX}${(@k)^dopts[(I)${PREFIX[1]}*]#?}" \
-			         "${PREFIX}${(@k)^dmopts[(I)${PREFIX[1]}*]#?}" \
-			         "${PREFIX}${(@k)^odopts[(I)${PREFIX[1]}*]#?}" \
-			         "${PREFIX}${(@k)^odmopts[(I)${PREFIX[1]}*]#?}" &&
-                ret=0
-          fi
+	if [[ -n "$sopts" && -n "$PREFIX" && -n "$soptseq" && "$PREFIX" = [-+]${~soptseq1} ]]; then
+	  compadd "$expl[@]" -Q - "$PREFIX" && ret=0
 	else
-          compadd "$expl[@]" - "${(@k)opts}" "${(@k)mopts}" \
-                               "${(@k)dopts}" "${(@k)dmopts}" \
-			       "${(@k)odopts}" "${(@k)odmopts}" && ret=0
+          compadd "$expl[@]" -Q - "${(@k)opts}" "${(@k)mopts}" \
+				  "${(@k)odopts}" "${(@k)odmopts}" && ret=0
+	  compadd "$expl[@]" -QS '' - "${(@k)dopts}" "${(@k)dmopts}" && ret=0
         fi
       fi
       [[ $#long -ne 0 &&