From 6c48ef6b45a6b64280c1cd851b9b9ebb9ed5bc86 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Sat, 21 Nov 2009 06:51:14 +0000 Subject: 27415: Src/Zle/computil.c: comparguments "*::..." descriptions could step on sequentially earlier descriptions when completing for a word other than the last word on the command line. --- Src/Zle/computil.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c index f2837ed93..17d69411d 100644 --- a/Src/Zle/computil.c +++ b/Src/Zle/computil.c @@ -2133,6 +2133,23 @@ ca_parse_line(Cadef d, int multi, int first) if ((adef = state.def = ca_get_arg(d, state.nth)) && (state.def->type == CAA_RREST || state.def->type == CAA_RARGS)) { + + /* Bart 2009/11/17: + * We've reached the "rest" definition. If at this point + * we already found another definition that describes the + * current word, use that instead. If not, prep for the + * "narrowing" of scope to only the remaining words. + * + * We can't test ca_laststate.def in the loop conditions + * at the top because this same loop also handles the + * ':*PATTERN:MESSAGE:ACTION' form for multiple arguments + * after an option, which may need to continue scanning. + * There might be an earlier point at which this test can + * be made but tracking it down is not worth the effort. + */ + if (ca_laststate.def) + break; + state.inrest = 0; state.opt = (cur == state.nargbeg + 1 && (!multi || !*line || -- cgit 1.4.1