summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/lex.c9
-rw-r--r--Src/parse.c10
-rw-r--r--Src/zsh.h1
3 files changed, 18 insertions, 2 deletions
diff --git a/Src/lex.c b/Src/lex.c
index 23b0a1cd9..d4132fe76 100644
--- a/Src/lex.c
+++ b/Src/lex.c
@@ -267,9 +267,13 @@ zshlex(void)
{
if (tok == LEXERR)
return;
- do
+ do {
+ if (inrepeat_)
+ ++inrepeat_;
+ if (inrepeat_ == 3 && isset(SHORTLOOPS))
+ incmdpos = 1;
tok = gettok();
- while (tok != ENDINPUT && exalias());
+ } while (tok != ENDINPUT && exalias());
nocorrect &= 1;
if (tok == NEWLIN || tok == ENDINPUT) {
while (hdocs) {
@@ -1899,6 +1903,7 @@ exalias(void)
zshlextext[0] == '}' && !zshlextext[1])) &&
(rw = (Reswd) reswdtab->getnode(reswdtab, zshlextext))) {
tok = rw->token;
+ inrepeat_ = (tok == REPEAT);
if (tok == DINBRACK)
incond = 1;
} else if (incond && !strcmp(zshlextext, "]]")) {
diff --git a/Src/parse.c b/Src/parse.c
index 4829e3a6d..628a9aa2d 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -63,6 +63,12 @@ int isnewlin;
/**/
int infor;
+/* != 0 if we are after a repeat keyword; if it's nonzero it's a 1-based index
+ * of the current token from the last-seen command position */
+
+/**/
+int inrepeat_; /* trailing underscore because of name clash with Zle/zle_vi.c */
+
/* != 0 if parsing arguments of typeset etc. */
/**/
@@ -271,6 +277,7 @@ parse_context_save(struct parse_stack *ps, int toplevel)
ps->incasepat = incasepat;
ps->isnewlin = isnewlin;
ps->infor = infor;
+ ps->inrepeat_ = inrepeat_;
ps->intypeset = intypeset;
ps->hdocs = hdocs;
@@ -305,6 +312,7 @@ parse_context_restore(const struct parse_stack *ps, int toplevel)
incasepat = ps->incasepat;
isnewlin = ps->isnewlin;
infor = ps->infor;
+ inrepeat_ = ps->inrepeat_;
intypeset = ps->intypeset;
hdocs = ps->hdocs;
@@ -447,6 +455,7 @@ init_parse_status(void)
* using the lexical analyser for strings as well as here.
*/
incasepat = incond = inredir = infor = intypeset = 0;
+ inrepeat_ = 0;
incmdpos = 1;
}
@@ -1482,6 +1491,7 @@ par_while(int *cmplx)
static void
par_repeat(int *cmplx)
{
+ /* ### what to do about inrepeat_ here? */
int oecused = ecused, p;
p = ecadd(0);
diff --git a/Src/zsh.h b/Src/zsh.h
index b83b8bdbb..eee31dad1 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -2921,6 +2921,7 @@ struct parse_stack {
int incasepat;
int isnewlin;
int infor;
+ int inrepeat_;
int intypeset;
int eclen, ecused, ecnpats;