diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/input.c | 27 | ||||
-rw-r--r-- | Src/zsh.h | 5 |
2 files changed, 21 insertions, 11 deletions
diff --git a/Src/input.c b/Src/input.c index 30970a060..4a5bf89c6 100644 --- a/Src/input.c +++ b/Src/input.c @@ -56,8 +56,9 @@ * inpop(), which effectively flushes any unread input as well as restoring * the previous input state. * - * The internal flag INP_ALCONT shows that the stack element was pushed - * by an alias expansion; it should not be needed elsewhere. + * The internal flags INP_ALCONT and INP_HISTCONT show that the stack + * element was pushed by an alias or history expansion; they should not + * be needed elsewhere. * * The global variable inalmore is set to indicate aliases should * continue to be expanded because the last alias expansion ended @@ -446,7 +447,8 @@ inungetc(int c) * we may need to restore an alias popped from the stack. * Note this may be a dummy (history expansion) entry. */ - if (inbufptr == inbufpush && inbufflags & INP_ALCONT) { + if (inbufptr == inbufpush && + (inbufflags & (INP_ALCONT|INP_HISTCONT))) { /* * Go back up the stack over all entries which were alias * expansions and were pushed with nothing remaining to read. @@ -455,8 +457,12 @@ inungetc(int c) if (instacktop->alias) instacktop->alias->inuse = 1; instacktop++; - } while ((instacktop->flags & INP_ALCONT) && !instacktop->bufleft); - inbufflags = INP_CONT|INP_ALIAS; + } while ((instacktop->flags & (INP_ALCONT|INP_HISTCONT)) + && !instacktop->bufleft); + if (inbufflags & INP_HISTCONT) + inbufflags = INP_CONT|INP_ALIAS|INP_HIST; + else + inbufflags = INP_CONT|INP_ALIAS; inbufleft = 0; inbuf = inbufptr = ""; } @@ -522,7 +528,7 @@ inpush(char *str, int flags, Alias inalias) instacktop->bufptr = inbufptr; instacktop->bufleft = inbufleft; instacktop->bufct = inbufct; - inbufflags &= ~INP_ALCONT; + inbufflags &= ~(INP_ALCONT|INP_HISTCONT); if (flags & (INP_ALIAS|INP_HIST)) { /* * Text is expansion for history or alias, so continue @@ -531,7 +537,10 @@ inpush(char *str, int flags, Alias inalias) * and mark alias as in use. */ flags |= INP_CONT|INP_ALIAS; - instacktop->flags = inbufflags | INP_ALCONT; + if (flags & INP_HIST) + instacktop->flags = inbufflags | INP_HISTCONT; + else + instacktop->flags = inbufflags | INP_ALCONT; if ((instacktop->alias = inalias)) inalias->inuse = 1; } else { @@ -570,7 +579,7 @@ static void inpoptop(void) { if (!lexstop) { - inbufflags &= ~INP_ALCONT; + inbufflags &= ~(INP_ALCONT|INP_HISTCONT); while (inbufptr > inbuf) { inbufptr--; inbufct++; @@ -598,7 +607,7 @@ inpoptop(void) inbufct = instacktop->bufct; inbufflags = instacktop->flags; - if (!(inbufflags & INP_ALCONT)) + if (!(inbufflags & (INP_ALCONT|INP_HISTCONT))) return; if (instacktop->alias) { diff --git a/Src/zsh.h b/Src/zsh.h index 403e8d3b9..486ad800a 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -411,8 +411,9 @@ enum { #define INP_HIST (1<<2) /* expanding history */ #define INP_CONT (1<<3) /* continue onto previously stacked input */ #define INP_ALCONT (1<<4) /* stack is continued from alias expn. */ -#define INP_LINENO (1<<5) /* update line number */ -#define INP_APPEND (1<<6) /* Append new lines to allow backup */ +#define INP_HISTCONT (1<<5) /* stack is continued from history expn. */ +#define INP_LINENO (1<<6) /* update line number */ +#define INP_APPEND (1<<7) /* Append new lines to allow backup */ /* Flags for metafy */ #define META_REALLOC 0 |