diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Src/hist.c | 14 | ||||
-rw-r--r-- | Src/lex.c | 19 |
3 files changed, 38 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog index bc7ac80d3..cd9393fdb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-03-22 Peter Stephenson <p.w.stephenson@ntlworld.com> + + * 34758: Src/hist.c, Src/lex.c: more problems with history + interaction with command substitution: rewind over input history + text when necessary. + 2015-03-21 Barton E. Schaefer <schaefer@zsh.org> * users/20034: Completion/Base/Core/_main_complete: adjust diff --git a/Src/hist.c b/Src/hist.c index b7ef52230..70dfac036 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -527,10 +527,20 @@ histsubchar(int c) static int marg = -1; static zlong mev = -1; char *buf, *ptr; - char *sline; + char *sline, *lexraw_mark; Histent ehist; size_t buflen; + /* + * If accumulating raw input for use in command substitution, + * we don't want the history text, so mark it for later removal. + * It would be better to do this at a level above the history + * and below the lexer --- but there isn't one. + * + * Include the character we are attempting to substitute. + */ + lexraw_mark = zshlex_raw_mark(-1); + /* look, no goto's */ if (isfirstch && c == hatchar) { int gbal = 0; @@ -864,6 +874,8 @@ histsubchar(int c) } } + zshlex_raw_back_to_mark(lexraw_mark); + /* * Push the expanded value onto the input stack, * marking this as a history word for purposes of the alias stack. diff --git a/Src/lex.c b/Src/lex.c index 1eb0bc7d7..6b9e94289 100644 --- a/Src/lex.c +++ b/Src/lex.c @@ -1871,6 +1871,25 @@ zshlex_raw_back(void) lexbuf_raw.len--; } +/**/ +char * +zshlex_raw_mark(int offset) +{ + if (!lex_add_raw) + return NULL; + return lexbuf_raw.ptr + offset; +} + +/**/ +void +zshlex_raw_back_to_mark(char *mark) +{ + if (!lex_add_raw) + return; + lexbuf_raw.len -= lexbuf_raw.ptr - mark; + lexbuf_raw.ptr = mark; +} + /* * Skip (...) for command-style substitutions: $(...), <(...), >(...) * |