zsh-workers
 help / color / mirror / code / Atom feed
From: Tanaka Akira <akr@jaist.ac.jp>
To: zsh-workers@sunsite.auc.dk
Subject: Re: PATCH: completion
Date: 21 Aug 1999 17:39:17 +0900	[thread overview]
Message-ID: <rsqbtc1wmru.fsf@crane.jaist.ac.jp> (raw)
In-Reply-To: Tanaka Akira's message of "21 Aug 1999 08:22:55 +0900"

In article <rsq672a11gw.fsf@crane.jaist.ac.jp>,
  Tanaka Akira <akr@jaist.ac.jp> writes:

> But, in general, help messages may not able to modify.  Therefore I
> think it is useful that _arguments can handle options started with
> "--".

Oops. I found that already _arguments can handle options started with
"--" without _long_options.  But also I fount that it is bit
problematic with -s.

Z(2):akr@is27e1u11% ./Src/zsh -f
is27e1u11% bindkey -e ; autoload -U compinit; compinit -D; compdef _tst tst
compconf group_matches=yes
compconf message_format='%d'
compconf description_format='%d'
is27e1u11% compconf group_matches=yes
is27e1u11% compconf message_format='%d'
is27e1u11% compconf description_format='%d'
is27e1u11% _tst () { _arguments -s '-a' '-b' '--xxx=-:descr:(a b c)' '--yyy=-:descr:(z y x)' }
is27e1u11% tst -a<TAB>
option
-a         -a-xxx\=   -a-yyy\=   -ab        

etc.

Index: Completion/Base/_arguments
===================================================================
RCS file: /projects/zsh/zsh/Completion/Base/_arguments,v
retrieving revision 1.1.1.5
diff -u -F^( -r1.1.1.5 _arguments
--- _arguments	1999/08/20 23:24:13	1.1.1.5
+++ _arguments	1999/08/21 08:32:36
@@ -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 @@
   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 @@
         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 @@
 	  # 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 @@
 
 	    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 @@
 	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 @@
         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 @@
 	  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 @@
 	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 @@
 	  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 @@
           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 @@
 
       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 @@
     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 @@
     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 @@
     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 @@
       done
     fi
 
-    [[ -n "$single" && -n "$opt" && "$PREFIX" = [-+]* ]] && \
+    [[ -n "$sopts" && -n "$opt" && "$PREFIX" = [-+]* ]] && \
         uns="${PREFIX[2,-1]}"
 
     [[ -n "$uns" ]] &&
@@ -433,25 +447,12 @@
       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 &&
Index: Completion/User/_patch
===================================================================
RCS file: /projects/zsh/zsh/Completion/User/_patch,v
retrieving revision 1.1.1.1
diff -u -F^( -r1.1.1.1 _patch
--- _patch	1999/08/20 23:55:52	1.1.1.1
+++ _patch	1999/08/21 08:35:32
@@ -12,7 +12,7 @@
   '-b' \
   '-V+:version control style:(simple numbered existing)' \
   '-B+:backup path prefix:' \
-  '-Y+:basename basename prefix:_files' \
+  '-Y+:backup basename prefix:_files' \
   '-z+:backup file suffix:(.bak)' \
   '-g+:NUM:' \
   '-t' '-f' '-s' \
-- 
Tanaka Akira


  reply	other threads:[~1999-08-21  8:39 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-08-20 12:59 Sven Wischnowsky
1999-08-20 23:22 ` Tanaka Akira
1999-08-21  8:39   ` Tanaka Akira [this message]
1999-08-21 17:47     ` Tanaka Akira
  -- strict thread matches above, loose matches on Subject: below --
2000-02-21  9:50 Sven Wischnowsky
1999-10-28  8:12 Sven Wischnowsky
1999-10-28  6:58 Sven Wischnowsky
1999-10-27  8:42 Sven Wischnowsky
1999-10-27 16:39 ` Bart Schaefer
1999-10-27  7:14 Sven Wischnowsky
1999-10-27 21:26 ` Tanaka Akira
1999-10-26 13:17 Sven Wischnowsky
1999-10-26 13:01 Oliver Kiddle
1999-10-26 13:35 ` Zefram
1999-10-26 11:03 Sven Wischnowsky
1999-10-26 17:17 ` Bart Schaefer
1999-10-26 17:22 ` Tanaka Akira
1999-10-26 17:32   ` Tanaka Akira
1999-08-30  9:30 Sven Wischnowsky
1999-08-27  7:03 Sven Wischnowsky
1999-08-27  8:29 ` Tanaka Akira
1999-08-28  6:01   ` Tanaka Akira
1999-08-26 13:52 Sven Wischnowsky
1999-08-26 12:20 Sven Wischnowsky
1999-08-26 13:17 ` Tanaka Akira
1999-08-26 17:56 ` Tanaka Akira
1999-08-25 12:57 Sven Wischnowsky
1999-08-25 12:54 Sven Wischnowsky
1999-08-25  8:24 Sven Wischnowsky
1999-08-26 10:54 ` Tanaka Akira
1999-08-24 10:43 Sven Wischnowsky
1999-08-25  1:56 ` Tanaka Akira
1999-08-24  9:12 Sven Wischnowsky
1999-08-24 10:04 ` Tanaka Akira
1999-08-23 13:46 Sven Wischnowsky
1999-08-23 16:16 ` Tanaka Akira
1999-08-24 15:56 ` Tanaka Akira
1999-08-23 12:00 Sven Wischnowsky
1999-08-23  9:32 Sven Wischnowsky
1999-08-23 10:54 ` Tanaka Akira
1999-08-20  7:42 Sven Wischnowsky
1999-08-19 13:59 Sven Wischnowsky
1999-08-19 10:44 Sven Wischnowsky
1999-08-19 14:38 ` Tanaka Akira
1999-08-24 13:46 ` Peter Stephenson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=rsqbtc1wmru.fsf@crane.jaist.ac.jp \
    --to=akr@jaist.ac.jp \
    --cc=zsh-workers@sunsite.auc.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).