diff options
author | Sven Wischnowsky <wischnow@users.sourceforge.net> | 2000-05-29 08:00:46 +0000 |
---|---|---|
committer | Sven Wischnowsky <wischnow@users.sourceforge.net> | 2000-05-29 08:00:46 +0000 |
commit | a2750a4effef1db7966530cd39905dbb7cf2b99c (patch) | |
tree | 0ccf8cc00e18527fe9e59d093c20bcf0dbe812bf | |
parent | 7a3ca7a673d98fcbe50c192cba6165d17505e394 (diff) | |
download | zsh-a2750a4effef1db7966530cd39905dbb7cf2b99c.tar.gz zsh-a2750a4effef1db7966530cd39905dbb7cf2b99c.tar.xz zsh-a2750a4effef1db7966530cd39905dbb7cf2b99c.zip |
fixes for _arguments with sets; make _zpty not use sets (11624)
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Completion/Base/_arguments | 6 | ||||
-rw-r--r-- | Completion/Builtins/_zpty | 53 | ||||
-rw-r--r-- | Doc/Zsh/compsys.yo | 7 | ||||
-rw-r--r-- | Src/Zle/computil.c | 22 |
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)))) && |