summary refs log tree commit diff
diff options
context:
space:
mode:
authorSven Wischnowsky <wischnow@users.sourceforge.net>2000-05-29 08:00:46 +0000
committerSven Wischnowsky <wischnow@users.sourceforge.net>2000-05-29 08:00:46 +0000
commita2750a4effef1db7966530cd39905dbb7cf2b99c (patch)
tree0ccf8cc00e18527fe9e59d093c20bcf0dbe812bf
parent7a3ca7a673d98fcbe50c192cba6165d17505e394 (diff)
downloadzsh-a2750a4effef1db7966530cd39905dbb7cf2b99c.tar.gz
zsh-a2750a4effef1db7966530cd39905dbb7cf2b99c.tar.xz
zsh-a2750a4effef1db7966530cd39905dbb7cf2b99c.zip
fixes for _arguments with sets; make _zpty not use sets (11624)
-rw-r--r--ChangeLog6
-rw-r--r--Completion/Base/_arguments6
-rw-r--r--Completion/Builtins/_zpty53
-rw-r--r--Doc/Zsh/compsys.yo7
-rw-r--r--Src/Zle/computil.c22
5 files changed, 71 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index 167f2e1dc..80bc5ea58 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2000-05-29  Sven Wischnowsky  <wischnow@zsh.org>
+
+	* 11624: Completion/Base/_arguments, Completion/Builtins/_zpty,
+ 	Doc/Zsh/compsys.yo, Src/Zle/computil.c: fixes for _arguments with
+ 	sets; make _zpty not use sets
+	
 2000-05-28  Bart Schaefer  <schaefer@zsh.org>
 
 	* 11618: Completion/Base/_arguments: Fix bad shift.
diff --git a/Completion/Base/_arguments b/Completion/Base/_arguments
index 11c62705f..44895d9d3 100644
--- a/Completion/Base/_arguments
+++ b/Completion/Base/_arguments
@@ -293,9 +293,9 @@ if (( $# )) && comparguments -i "$autod" "$@"; then
             fi
           fi
         fi
-        shift "${#descrs} ? 1 : 0" descrs
-        shift "${#actions} ? 1 : 0" actions
-        shift "${#subcs} ? 1 : 0" subcs
+        shift descrs
+        shift actions
+        shift subcs
       done
 
       if [[ -z "$matched$hasopts" ]] && _requested options &&
diff --git a/Completion/Builtins/_zpty b/Completion/Builtins/_zpty
index de793c814..dd551ab97 100644
--- a/Completion/Builtins/_zpty
+++ b/Completion/Builtins/_zpty
@@ -3,19 +3,42 @@
 local state line list names expl curcontext="$curcontext"
 typeset -A opt_args
 
+
 _arguments -C -s \
-  '(-r)*::args:_normal' \
- - eb \
-  '-e[echo input characters]' \
-  '-b[io to pseudo-terminal blocking]' \
- - d \
-  '-d[delete command]:*:name:->name' \
- - w \
-  '-w[send string to command]:name:->name:*:strings to write' \
- - L \
-  '-L[list defined commands as calls]' \
- - r \
-  '(*)-r[read string from command]:name:->name:param:_parameters' && return 0
+  '(-r -w -L -d)-e[echo input characters]' \
+  '(-r -w -L -d)-b[io to pseudo-terminal blocking]' \
+  '(-r -w -L -e -b)-d[delete command]:*:name:->name' \
+  '(-r -L -e -b -d)-w[send string to command]:name:->name:*:strings to write' \
+  '(: -r -w -e -b -d)-L[list defined commands as calls]' \
+  '(: -w -L -e -b -d)-r[read string from command]:name:->name:param: _parameters:pattern:' \
+  '(-r -w -L -d):zpty command name:' \
+  '(-r -w -L -d):cmd: _command_names -e' \
+  '(-r -w -L -d)*::args:_precommand' && return 0
+
+# One could use sets, but that's more expensive and zpty is simple enough.
+#
+# _arguments -C -s \
+#   - read \
+#     '-r[read string from command]' \
+#     ':name:->name' \
+#     ':param: _parameters' \
+#     ':pattern:' \
+#   - write \
+#     '-w[send string to command]' \
+#     ':name:->name' \
+#     '*:strings to write' \
+#   - list \
+#     '-L[list defined commands as calls]' \
+#   - delete \
+#     '-d[delete command]' \
+#     '*:name:->name' \
+#   - start \
+#     '-e[echo input characters]' \
+#     '-b[io to pseudo-terminal blocking]' \
+#     ':zpty command name:' \
+#     ':cmd: _command_names -e' \
+#     '*::args:_precommand' && return 0
+
 
 if [[ $state = name ]]; then
   if ! zmodload -e zsh/zpty; then
@@ -26,8 +49,10 @@ if [[ $state = name ]]; then
   names=( ${list%%:*} )
   if zstyle -T ":completion:${curcontext}" verbose; then
     zformat -a list ' --' ${${(f)"$(zpty)"}#*\) }
-    _wanted names expl 'zpty command names' compadd -d list - "$names[@]"
+    _wanted names expl 'zpty command name' compadd -d list - "$names[@]"
   else
-    _wanted names expl 'zpty command names' compadd - "$names[@]"
+    _wanted names expl 'zpty command name' compadd - "$names[@]"
   fi
+else
+  return 1
 fi
diff --git a/Doc/Zsh/compsys.yo b/Doc/Zsh/compsys.yo
index 9982cda7a..1e5ffa584 100644
--- a/Doc/Zsh/compsys.yo
+++ b/Doc/Zsh/compsys.yo
@@ -2867,6 +2867,13 @@ options will be completed after the first non-option argument on the
 line. With tt(-S), no option will be completed after a `tt(-)tt(-)' on 
 the line and this argument will otherwise be ignored.
 
+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 a option specification with
+rest-arguments (as in `tt(-foo:*:...)' often allows to avoid the use
+of multiple sets.
+
 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
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index e627f37a2..d8b4f0cb6 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -510,7 +510,8 @@ parse_caarg(int mult, int type, int num, int opt, char *oname, char **def,
 		*p = ':';
 	} else
 	    ret->action = ztrdup(rembslashcolon(p + 1));
-    }
+    } else
+	ret->action = ztrdup("");
     *def = p;
 
     return ret;
@@ -588,7 +589,7 @@ parse_cadef(char *nam, char **args)
     /* Now get the -s, -A, -S and -M options. */
 
     args++;
-    while ((p = *args) && *p == '-') {
+    while ((p = *args) && *p == '-' && p[1]) {
 	for (q = ++p; *q; q++)
 	    if (*q == 'M') {
 		q = "";
@@ -1226,7 +1227,7 @@ ca_parse_line(Cadef d, int multi, int first)
     Caopt ptr, wasopt, dopt;
     struct castate state;
     char *line, *pe, **argxor = NULL;
-    int cur, doff, argend;
+    int cur, doff, argend, arglast;
     Patprog endpat = NULL;
 
     /* Free old state. */
@@ -1284,7 +1285,7 @@ ca_parse_line(Cadef d, int multi, int first)
 	 line; line = compwords[cur++]) {
 	ddef = adef = NULL;
 	dopt = NULL;
-	doff = state.singles = 0;
+	doff = state.singles = arglast = 0;
 
 	if (ca_inactive(d, argxor, cur, 0) ||
 	    ((d->flags & CDF_SEP) && !strcmp(line, "--"))) {
@@ -1423,6 +1424,7 @@ ca_parse_line(Cadef d, int multi, int first)
 	    if ((d->flags & CDF_ARG) && ca_inactive(d, NULL, cur + 1, 1))
 		return 1;
 
+	    arglast = 1;
 	    if (state.inopt) {
 		state.inopt = 0;
 		state.nargbeg = cur - 1;
@@ -1434,7 +1436,11 @@ ca_parse_line(Cadef d, int multi, int first)
 		(state.def->type == CAA_RREST ||
 		 state.def->type == CAA_RARGS)) {
 		state.inrest = 0;
-		state.opt = (cur == state.nargbeg + 1);
+		state.opt = (cur == state.nargbeg + 1 &&
+			     (!*line || 
+			      ((*line == '-' || *line == '+') &&
+			       (!line[1] ||
+				(*line == '-' && line[1] == '-' && !line[2])))));
 		state.optbeg = state.nargbeg;
 		state.argbeg = cur - 1;
 		state.argend = argend;
@@ -1510,6 +1516,10 @@ ca_parse_line(Cadef d, int multi, int first)
 		}
 	    } else {
 		ca_laststate.def = adef;
+		ca_laststate.opt = (!arglast || !*line || 
+				    ((*line == '-' || *line == '+') &&
+				     (!line[1] ||
+				      (*line == '-' && line[1] == '-' && !line[2]))));
 		ca_laststate.ddef = NULL;
 		ca_laststate.dopt = NULL;
 		ca_laststate.optbeg = state.nargbeg;
@@ -1801,7 +1811,7 @@ bin_comparguments(char *nam, char **args, char *ops, int func)
 	    for (; lstate; lstate = lstate->snext) {
 		if (lstate->actopts &&
 		    (lstate->opt || (lstate->doff && lstate->def) ||
-		     (lstate->def &&
+		     (lstate->def && lstate->def->opt &&
 		      (lstate->def->type == CAA_OPT ||
 		       (lstate->def->type >= CAA_RARGS &&
 			lstate->def->num < 0)))) &&