aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/getchar.c8
-rw-r--r--src/nvim/globals.h4
-rw-r--r--src/nvim/normal.c6
3 files changed, 14 insertions, 4 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index add650a430..0f55158733 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -2400,7 +2400,8 @@ static int vgetorpeek(bool advance)
vgetc_busy++;
if (advance) {
- KeyStuffed = FALSE;
+ KeyStuffed = false;
+ typebuf_was_empty = false;
}
init_typebuf();
@@ -2626,6 +2627,11 @@ static int vgetorpeek(bool advance)
}
tc = c;
+ // set a flag to indicate this wasn't a normal char
+ if (advance) {
+ typebuf_was_empty = true;
+ }
+
// return 0 in normal_check()
if (pending_exmode_active) {
exmode_active = true;
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index 954b62883e..231220c319 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -705,6 +705,10 @@ EXTERN int recoverymode INIT(= false); // Set to true for "-r" option
// typeahead buffer
EXTERN typebuf_T typebuf INIT(= { NULL, NULL, 0, 0, 0, 0, 0, 0, 0 });
+/// Flag used to indicate that vgetorpeek() returned a char like Esc when the
+/// :normal argument was exhausted.
+EXTERN bool typebuf_was_empty INIT(= false);
+
EXTERN int ex_normal_busy INIT(= 0); // recursiveness of ex_normal()
EXTERN int ex_normal_lock INIT(= 0); // forbid use of ex_normal()
EXTERN int ignore_script INIT(= false); // ignore script input
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index 1d8a786c9f..2c7dadad0b 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -6943,10 +6943,10 @@ static void nv_esc(cmdarg_T *cap)
got_int = false; // don't stop executing autocommands et al.
return;
}
- } 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;
}