Mercurial > vim
changeset 29790:8874cb642b70 v9.0.0234
patch 9.0.0234: cannot make difference between :normal end and argument char
Commit: https://github.com/vim/vim/commit/8d69637133e17370491b83da8657a15b991c2f76
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 21 Aug 2022 11:45:04 +0200 |
parents | 96b00c91ce90 |
children | 069316b0c18c |
files | src/getchar.c src/globals.h src/normal.c src/version.c |
diffstat | 4 files changed, 16 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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;
--- 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()
--- 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; }