about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSven Wischnowsky <wischnow@users.sourceforge.net>2001-04-04 11:29:19 +0000
committerSven Wischnowsky <wischnow@users.sourceforge.net>2001-04-04 11:29:19 +0000
commit163b0101ed6d63c735590d561a8026d74d964401 (patch)
tree81dc4c353e7e912db60f33a00c3a4e792604e623
parentec01fb14b45369edadab11e88c5ce32933148c94 (diff)
downloadzsh-163b0101ed6d63c735590d561a8026d74d964401.tar.gz
zsh-163b0101ed6d63c735590d561a8026d74d964401.tar.xz
zsh-163b0101ed6d63c735590d561a8026d74d964401.zip
add -W option to _arguments, which allows to complete options after options that take an argument in the next word (13902)
-rw-r--r--ChangeLog8
-rw-r--r--Completion/Base/Utility/_arguments21
-rw-r--r--Completion/X/Utility/_x_arguments2
-rw-r--r--Completion/X/Utility/_xt_arguments2
-rw-r--r--Doc/Zsh/compsys.yo21
5 files changed, 41 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index e696d1efc..f4de207cd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2001-04-04  Sven Wischnowsky  <wischnow@zsh.org>
+
+	* 13902: Completion/Base/Utility/_arguments,
+	Completion/X/Utility/_x_arguments,
+	Completion/X/Utility/_xt_arguments, Doc/Zsh/compsys.yo: add -W
+	option to _arguments, which allows to complete options after
+	options that take an argument in the next word
+
 2000-04-03  Clint Adams  <schizo@debian.org>
 
 	* 13899: Completion/Unix/Command/_apm: add $OSTYPE checking.
diff --git a/Completion/Base/Utility/_arguments b/Completion/Base/Utility/_arguments
index e947dc8ad..33f4c1e33 100644
--- a/Completion/Base/Utility/_arguments
+++ b/Completion/Base/Utility/_arguments
@@ -4,7 +4,7 @@
 # descriptions given as arguments to this function.
 
 local long cmd="$words[1]" descr mesg subopts opt usecc autod
-local oldcontext="$curcontext" hasopts rawret
+local oldcontext="$curcontext" hasopts rawret optarg singopt
 
 long=$argv[(I)--]
 if (( long )); then
@@ -173,18 +173,21 @@ if (( long )); then
 fi
 
 subopts=()
-while [[ "$1" = -(O*|[CR]) ]]; do
+singopt=()
+while [[ "$1" = -(O*|[CRWs]) ]]; do
   case "$1" in
   -C)  usecc=yes; shift ;;
   -O)  subopts=( "${(@P)2}" ); shift 2 ;;
   -O*) subopts=( "${(@P)1[3,-1]}" ); shift ;;
   -R)  rawret=yes; shift;;
+  -W)  optarg=yes; shift;;
+  -s)  singopt=(-s); shift;;
   esac
 done
 
 zstyle -s ":completion:${curcontext}:options" auto-description autod
 
-if (( $# )) && comparguments -i "$autod" "$@"; then
+if (( $# )) && comparguments -i "$autod" "$singopt[@]" "$@"; then
   local action noargs aret expl local tried
   local next direct odirect equal single matcher matched ws tmp1 tmp2 tmp3
   local opts subc tc prefix suffix descrs actions subcs anum
@@ -335,14 +338,19 @@ if (( $# )) && comparguments -i "$autod" "$@"; then
           if [[ "$single" = direct ]]; then
             _all_labels options expl option \
 	        compadd -QS '' - "${PREFIX}${SUFFIX}"
-          elif [[ "$single" = next ]]; then
+          elif [[ -z "$optarg" && "$single" = next ]]; then
             _all_labels options expl option \
 	        compadd -Q - "${PREFIX}${SUFFIX}"
           elif [[ "$single" = equal ]]; then
             _all_labels options expl option \
 	        compadd -QqS= - "${PREFIX}${SUFFIX}"
           else
+
 	    tmp1=( "$next[@]" "$direct[@]" "$odirect[@]" "$equal[@]" )
+
+            [[ "$single" = next ]] &&
+                tmp1=( "${(@)tmp1:#[-+]${PREFIX[-1]}((#e)|:*)}" )
+
 	    [[ "$PREFIX" != --* ]] && tmp1=( "${(@)tmp1:#--*}" )
 	    tmp3=( "${(M@)tmp1:#[-+]?[^:]*}" )
 	    tmp1=( "${(M@)tmp1:#[-+]?(|:*)}" )
@@ -351,6 +359,11 @@ if (( $# )) && comparguments -i "$autod" "$@"; then
             _describe -o option \
                       tmp1 tmp2 -Q -S '' -- \
 		      tmp3 -Q
+
+            [[ -n "$optarg" && "$single" = next && nm -eq $compstate[nmatches] ]] &&
+                _all_labels options expl option \
+	            compadd -Q - "${PREFIX}${SUFFIX}"
+
           fi
           single=yes
         else
diff --git a/Completion/X/Utility/_x_arguments b/Completion/X/Utility/_x_arguments
index 8f1723cc6..ba6dd2a68 100644
--- a/Completion/X/Utility/_x_arguments
+++ b/Completion/X/Utility/_x_arguments
@@ -17,7 +17,7 @@ else
 fi
 
 opts=()
-while [[ $1 = -(O*|[CR]) ]]; do
+while [[ $1 = -(O*|[CRWs]) ]]; do
   opts=($opts $1)
   [[ $1 = -R ]] && rawret=yes
   shift
diff --git a/Completion/X/Utility/_xt_arguments b/Completion/X/Utility/_xt_arguments
index e8dafc60c..e17653251 100644
--- a/Completion/X/Utility/_xt_arguments
+++ b/Completion/X/Utility/_xt_arguments
@@ -53,7 +53,7 @@ else
 fi
 
 opts=()
-while [[ $1 = -(O*|[CR]) ]]; do
+while [[ $1 = -(O*|[CRWs]) ]]; do
   opts=($opts $1)
   [[ $1 = -R ]] && rawret=yes
   shift
diff --git a/Doc/Zsh/compsys.yo b/Doc/Zsh/compsys.yo
index 988b6be63..129cabdb5 100644
--- a/Doc/Zsh/compsys.yo
+++ b/Doc/Zsh/compsys.yo
@@ -2930,6 +2930,13 @@ two hyphens (like `tt(-)tt(-prefix)') are still considered to contain only
 one option name.  This allows the use of the `tt(-s)' option to describe
 single-letter options together with such long option names.
 
+The tt(-s) option may be combined with the option tt(-W) to say that more
+option characters are to be expected even after an option that takes an
+argument.  For example, if a command takes the options `tt(a)' and `tt(b)',
+where `tt(a)' takes an argument in the next word, tt(_arguments) would
+normally not complete the other option directly after `tt(-a)', but it would
+allow that if given the tt(-W) option.
+
 The forms of var(optspec) are:
 
 startitem()
@@ -3202,6 +3209,13 @@ example(_arguments \
   - '(uncompress)' \ 
     {-d,--decompress}'[decompress]')
 
+Note that using multiple sets will be slower than using only one set
+because the completion code has to parse the command line once for
+every set. So more than one set should only be used if the command
+syntax is too complicated. Note also that an option specification with
+rest-arguments (as in `tt(-foo:*:...)') often allows the use of
+multiple sets to be avoided.
+
 To simplify the specifications for commands with standard option
 parsing, the options tt(-S) and tt(-A) may be given.  With tt(-S), no
 option will be completed after a `tt(-)tt(-)' on the line and this
@@ -3213,13 +3227,6 @@ completing options after the first normal argument, but ignoring all
 strings starting with a hyphen even if they are not described by one
 of the var(optspec)s, one would use: `tt(-A "-*")'.
 
-Note that using multiple sets will be slower than using only one set
-because the completion code has to parse the command line once for
-every set. So more than one set should only be used if the command
-syntax is too complicated. Note also that an option specification with
-rest-arguments (as in `tt(-foo:*:...)') often allows the use of
-multiple sets to be avoided.
-
 Another option supported is `tt(-O) var(name)'. The var(name) will be
 taken as the name of an array and its elements will be given to
 functions called to generate matches when executing the