# HG changeset patch # User Bram Moolenaar # Date 1661075104 -7200 # Node ID 8874cb642b70dcaf45925bf692455512ec04fc17 # Parent 96b00c91ce904fd586f4e5032e35cd5387b102d1 patch 9.0.0234: cannot make difference between :normal end and argument char Commit: https://github.com/vim/vim/commit/8d69637133e17370491b83da8657a15b991c2f76 Author: Bram Moolenaar Date: Sun Aug 21 10:40:07 2022 +0100 patch 9.0.0234: cannot make difference between :normal end and argument char Problem: Cannot make difference between the end of :normal and a character in its argument. Solution: Add the "typebuf_was_empty" flag. (closes #10950) diff --git a/src/getchar.c b/src/getchar.c --- a/src/getchar.c +++ b/src/getchar.c @@ -3056,7 +3056,10 @@ vgetorpeek(int advance) ++vgetc_busy; if (advance) + { KeyStuffed = FALSE; + typebuf_was_empty = FALSE; + } init_typebuf(); start_stuff(); @@ -3361,6 +3364,10 @@ vgetorpeek(int advance) #ifdef FEAT_CMDWIN tc = c; #endif + // set a flag to indicate this wasn't a normal char + if (advance) + typebuf_was_empty = TRUE; + // return from main_loop() if (pending_exmode_active) exmode_active = EXMODE_NORMAL; diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -1206,6 +1206,10 @@ EXTERN typebuf_T typebuf // typeahead b = {NULL, NULL, 0, 0, 0, 0, 0, 0, 0} #endif ; +// Flag used to indicate that vgetorpeek() returned a char like Esc when the +// :normal argument was exhausted. +EXTERN int typebuf_was_empty INIT(= FALSE); + EXTERN int ex_normal_busy INIT(= 0); // recursiveness of ex_normal() #ifdef FEAT_EVAL EXTERN int in_feedkeys INIT(= 0); // ex_normal_busy set in feedkeys() diff --git a/src/normal.c b/src/normal.c --- a/src/normal.c +++ b/src/normal.c @@ -6808,11 +6808,11 @@ nv_esc(cmdarg_T *cap) #endif } #ifdef FEAT_CMDWIN - else if (cmdwin_type != 0 && ex_normal_busy) + else if (cmdwin_type != 0 && ex_normal_busy && typebuf_was_empty) { // When :normal runs out of characters while in the command line window - // vgetorpeek() will return ESC. Exit the cmdline window to break the - // loop. + // vgetorpeek() will repeatedly return ESC. Exit the cmdline window to + // break the loop. cmdwin_result = K_IGNORE; return; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -732,6 +732,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 234, +/**/ 233, /**/ 232,