From a6ed22c58590da9faaaf9d9a46cf1050c2bb74d1 Mon Sep 17 00:00:00 2001 From: Sven Wischnowsky Date: Fri, 12 May 2000 14:36:46 +0000 Subject: fix for completing options with `_arguments -s'; fix for _message to use `builtin compadd' (11349) --- ChangeLog | 6 ++++++ Completion/Base/_arguments | 10 +++++++--- Completion/Core/_message | 2 +- Src/Zle/computil.c | 33 +++++++++++++++++++++------------ 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3d1179e99..2840ac971 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2000-05-12 Sven Wischnowsky + + * 11349: Completion/Base/_arguments, Completion/Core/_message, + Src/Zle/computil.c: fix for completing options with `_arguments + -s'; fix for _message to use `builtin compadd' + 2000-05-12 Oliver Kiddle * 11347: Completion/Builtins/_hash, Completion/Builtins/_vars_eq: diff --git a/Completion/Base/_arguments b/Completion/Base/_arguments index e12dca47d..453e3d3e2 100644 --- a/Completion/Base/_arguments +++ b/Completion/Base/_arguments @@ -184,12 +184,16 @@ if (( $# )) && comparguments "$multi[@]" "$autod" "$@"; then else noargs='no arguments' fi - if ! comparguments -O next direct odirect equal; then + if comparguments -O next direct odirect equal; then + opts=yes + _tags options + elif [[ $? -eq 2 ]]; then + compadd -Q - "${PREFIX}${SUFFIX}" + return 0 + else _message "$noargs" return 1 fi - opts=yes - _tags options fi context=() diff --git a/Completion/Core/_message b/Completion/Core/_message index a7d765a6a..cd08d5fb0 100644 --- a/Completion/Core/_message +++ b/Completion/Core/_message @@ -15,6 +15,6 @@ fi if [[ -n "$format$raw" ]]; then [[ -z "$raw" ]] && zformat -f format "$format" "d:$1" "${(@)argv[2,-1]}" - compadd -x "$format" + builtin compadd -x "$format" _comp_mesg=yes fi diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c index 483823798..462794b64 100644 --- a/Src/Zle/computil.c +++ b/Src/Zle/computil.c @@ -1124,7 +1124,7 @@ struct castate { Cadef d; int nopts; Caarg def, ddef; - Caopt curopt; + Caopt curopt, dopt; int opt, arg, argbeg, optbeg, nargbeg, restbeg, curpos, argend; int inopt, inrest, inarg, nth, doff, singles, oopt, actopts; LinkList args; @@ -1140,7 +1140,7 @@ static int ca_parse_line(Cadef d, int multi) { Caarg adef, ddef; - Caopt ptr, wasopt; + Caopt ptr, wasopt, dopt; struct castate state; char *line, *pe, **argxor = NULL; int cur, doff, argend; @@ -1174,7 +1174,7 @@ ca_parse_line(Cadef d, int multi) state.d = d; state.nopts = d->nopts; state.def = state.ddef = NULL; - state.curopt = NULL; + state.curopt = state.dopt = NULL; state.argbeg = state.optbeg = state.nargbeg = state.restbeg = state.actopts = state.nth = state.inopt = state.inarg = state.opt = state.arg = 1; state.argend = argend = arrlen(compwords) - 1; @@ -1198,6 +1198,7 @@ ca_parse_line(Cadef d, int multi) for (line = compwords[1], cur = 2, state.curopt = NULL, state.def = NULL; line; line = compwords[cur++]) { ddef = adef = NULL; + dopt = NULL; doff = state.singles = 0; if (ca_inactive(d, argxor, cur, 0) || @@ -1251,9 +1252,11 @@ ca_parse_line(Cadef d, int multi) (state.curopt->type == CAO_EQUAL ? (pe[-1] == '=' || !pe[0]) : 1))) { - ddef = state.def = ((state.curopt->type != CAO_EQUAL || - pe[-1] == '=') ? - state.curopt->args : NULL); + if ((ddef = state.def = ((state.curopt->type != CAO_EQUAL || + pe[-1] == '=') ? + state.curopt->args : NULL))) + dopt = state.curopt; + doff = pe - line; state.optbeg = state.argbeg = state.inopt = cur; state.argend = argend; @@ -1296,6 +1299,7 @@ ca_parse_line(Cadef d, int multi) Caopt tmpopt; ddef = state.def = state.curopt->args; + dopt = state.curopt; doff = pe - line; state.optbeg = state.argbeg = state.inopt = cur; state.argend = argend; @@ -1355,6 +1359,7 @@ ca_parse_line(Cadef d, int multi) memcpy(&ca_laststate, &state, sizeof(state)); ca_laststate.ddef = NULL; + ca_laststate.dopt = NULL; ca_laststate.doff = 0; break; } @@ -1389,6 +1394,7 @@ ca_parse_line(Cadef d, int multi) zaddlinknode(l, ztrdup(line)); ca_laststate.ddef = NULL; + ca_laststate.dopt = NULL; ca_laststate.doff = 0; break; } @@ -1402,12 +1408,14 @@ ca_parse_line(Cadef d, int multi) if (cur + 1 == compcurrent) { memcpy(&ca_laststate, &state, sizeof(state)); ca_laststate.ddef = NULL; + ca_laststate.dopt = NULL; ca_laststate.doff = 0; } else if (cur == compcurrent && !ca_laststate.def) { if ((ca_laststate.def = ddef)) { ca_laststate.singles = state.singles; if (state.curopt && state.curopt->type == CAO_NEXT) { ca_laststate.ddef = ddef; + ca_laststate.dopt = dopt; ca_laststate.def = NULL; ca_laststate.opt = 1; state.curopt->active = 1; @@ -1418,6 +1426,7 @@ ca_parse_line(Cadef d, int multi) } else { ca_laststate.def = adef; ca_laststate.ddef = NULL; + ca_laststate.dopt = NULL; ca_laststate.optbeg = state.nargbeg; ca_laststate.argbeg = state.restbeg; ca_laststate.argend = state.argend; @@ -1705,7 +1714,7 @@ bin_comparguments(char *nam, char **args, char *ops, int func) return 0; } - return 1; + return (ca_laststate.singles ? 2 : 1); case 'L': { Caopt opt = ca_get_opt(ca_laststate.d, args[1], 1, NULL); @@ -1719,13 +1728,13 @@ bin_comparguments(char *nam, char **args, char *ops, int func) } case 's': if (ca_laststate.d->single && ca_laststate.singles && - ca_laststate.actopts > 1 && ca_laststate.opt) { + ca_laststate.actopts && ca_laststate.opt) { setsparam(args[1], - ztrdup(ca_laststate.ddef ? - (ca_laststate.ddef->type == CAO_DIRECT ? + ztrdup((ca_laststate.ddef && ca_laststate.dopt) ? + (ca_laststate.dopt->type == CAO_DIRECT ? "direct" : - ((ca_laststate.ddef->type == CAO_OEQUAL || - ca_laststate.ddef->type == CAO_EQUAL) ? + ((ca_laststate.dopt->type == CAO_OEQUAL || + ca_laststate.dopt->type == CAO_EQUAL) ? "equal" : "next")) : "")); return 0; } -- cgit 1.4.1