diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/Zle/zle_tricky.c | 26 |
2 files changed, 29 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index 4b92ddcdd..e9e609c45 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-08-02 Peter Stephenson <p.w.stephenson@ntlworld.com> + + * 31611: Src/Zle/zle_tricky.c: attempt to fix crash in + "for in 1; do <[TAB] x". + 2013-08-01 Peter Stephenson <p.stephenson@samsung.com> * Thomas Klausner: 31625: Completion/X/Command/_mplayer: mplayer diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index 78a9fa490..610055c64 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -1095,6 +1095,7 @@ get_comp_string(void) * the command word is not at index zero in the array. */ int redirpos; + int noword; char *s = NULL, *tmp, *p, *tt = NULL, rdop[20]; char *linptr, *u; @@ -1165,7 +1166,7 @@ get_comp_string(void) * and whatnot. */ do { - qsub = 0; + qsub = noword = 0; lincmd = ((incmdpos && !ins && !incond) || (oins == 2 && wordpos == 2) || @@ -1239,6 +1240,19 @@ get_comp_string(void) * leave the loop. */ if (tt) break; + if (ins < 2) { + /* + * Don't add this as a word, because we're about to start + * a new command line: pretend there's no string here. + * We don't dare do this if we're using one of the + * *really* gross hacks with ins to get later words + * to look like command words, because we don't + * understand how they work. Quite possibly we + * should be using a mechanism like the one here rather + * than the ins thing. + */ + noword = 1; + } /* Otherwise reset the variables we are collecting data in. */ wordpos = cp = rd = ins = redirpos = 0; tt0 = NULLTOK; @@ -1253,6 +1267,14 @@ get_comp_string(void) /* If everything before is a redirection, don't reset the index */ if (wordpos != redirpos) wordpos = redirpos = 0; + } else if (tok == SEPER) { + /* + * A following DOLOOP should cause us to reset to the start + * of the command line. For some reason we only recognise + * DOLOOP for this purpose (above) if ins is set. Why? + * Don't ask pointless questions. + */ + ins = 1; } if (!lexflags && tt0 == NULLTOK) { /* This is done when the lexer reached the word the cursor is on. */ @@ -1322,7 +1344,7 @@ get_comp_string(void) else if (tok == DAMPER) tokstr = "&&"; } - if (!tokstr) + if (!tokstr || noword) continue; /* Hack to allow completion after `repeat n do'. */ if (oins == 2 && !wordpos && !strcmp(tokstr, "do")) |