From 3517e4a9a5caf2c3385a0b223a0474724c703d96 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Wed, 4 Apr 2018 18:33:00 +0100 Subject: 42581(?): Fix ZLE inline history expansion. Seen with magic-space. If there's a parse error in command subtitution we need to complete reading history to ensure the command line buffer is finished. --- ChangeLog | 6 ++++++ Src/hist.c | 22 ++++++++++++++++++++-- Src/lex.c | 2 +- Test/X03zlebindkey.ztst | 17 +++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index a2e83fb6e..b3eef2519 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2018-04-04 Peter Stephenson + + * 42581(?): Src/hist.c, Src/lex.c, Test/X03zlebindkey.ztst: history + expansion within ZLE needs history to be read to conclusion on + error. + 2018-03-31 Oliver Kiddle * 42572: Completion/Linux/Command/_ethtool, diff --git a/Src/hist.c b/Src/hist.c index b798be8e4..dbdc1e4e5 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -465,8 +465,26 @@ herrflush(void) { inpopalias(); - while (!lexstop && inbufct && !strin) - hwaddc(ingetc()); + if (lexstop) + return; + /* + * The lex_add_raw test is needed if we are parsing a command + * substitution when expanding history for ZLE: strin is set but we + * need to finish off the input because the string we are reading is + * going to be used directly in the line that goes to ZLE. + * + * Note that this is a side effect --- this is not the usual reason + * for testing lex_add_raw which is to add the text to a different + * buffer used when we are actually parsing the command substituion + * (nothing to do with ZLE). Sorry. + */ + while (inbufct && (!strin || lex_add_raw)) { + int c = ingetc(); + if (!lexstop) { + hwaddc(c); + addtoline(c); + } + } } /* diff --git a/Src/lex.c b/Src/lex.c index 2379804f2..44ad88043 100644 --- a/Src/lex.c +++ b/Src/lex.c @@ -158,7 +158,7 @@ mod_export int nocomments; /* add raw input characters while parsing command substitution */ /**/ -static int lex_add_raw; +int lex_add_raw; /* variables associated with the above */ diff --git a/Test/X03zlebindkey.ztst b/Test/X03zlebindkey.ztst index 013d3dfb3..298d7df5d 100644 --- a/Test/X03zlebindkey.ztst +++ b/Test/X03zlebindkey.ztst @@ -126,3 +126,20 @@ >CURSOR: 1 >BUFFER: ホ >CURSOR: 1 + + zpty_run 'bindkey " " magic-space' + setopt interactivecomments + zletest 'echo $(( x ) x ) y' + zletest 'echo $(( ##x ) ##x ) y' + unsetopt interactivecomments + zletest 'echo $(( x ) x ) y' + zletest 'echo $(( ##x ) ##x ) y' +0:history expansion of failed command substitution using magic-space binding +>BUFFER: echo $(( x ) x ) y +>CURSOR: 18 +>BUFFER: echo $(( ##x ) ##x ) y +>CURSOR: 22 +>BUFFER: echo $(( x ) x ) y +>CURSOR: 18 +>BUFFER: echo $(( ##x ) ##x ) y +>CURSOR: 22 -- cgit 1.4.1