summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-02-18 21:33:00 +0100
committerBram Moolenaar <Bram@vim.org>2020-02-18 21:33:00 +0100
commit9e2bcb5d23138d45a0b6f9c1542b5facc807efe7 (patch)
treea235c3311892fd24aafa6137c36d41e71b9b1640
parent1fa8d2c33d7290eda7dc2a94d4ec6a599a2d61dd (diff)
patch 8.2.0274: hang with combination of feedkeys(), Ex mode and :globalv8.2.0274
Problem: Hang with combination of feedkeys(), Ex mode and :global. (Yegappan Lakshmanan) Solution: Add the pending_exmode_active flag.
-rw-r--r--src/ex_docmd.c2
-rw-r--r--src/getchar.c4
-rw-r--r--src/globals.h4
-rw-r--r--src/testdir/test_ex_mode.vim8
-rw-r--r--src/version.c2
5 files changed, 20 insertions, 0 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index a819f64888..b78e5ac666 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -6185,9 +6185,11 @@ do_exedit(
hold_gui_events = 0;
#endif
must_redraw = CLEAR;
+ pending_exmode_active = TRUE;
main_loop(FALSE, TRUE);
+ pending_exmode_active = FALSE;
RedrawingDisabled = rd;
no_wait_return = nwr;
msg_scroll = ms;
diff --git a/src/getchar.c b/src/getchar.c
index d056bcc5d1..b828c27dd4 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -3041,6 +3041,10 @@ vgetorpeek(int advance)
#ifdef FEAT_CMDWIN
tc = c;
#endif
+ // return from main_loop()
+ if (pending_exmode_active)
+ exmode_active = EXMODE_NORMAL;
+
break;
}
diff --git a/src/globals.h b/src/globals.h
index bda75b486e..fc551ba996 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1028,6 +1028,10 @@ EXTERN int motion_force INIT(= 0); // motion force for pending operator
* Ex mode (Q) state
*/
EXTERN int exmode_active INIT(= 0); // zero, EXMODE_NORMAL or EXMODE_VIM
+
+// Flag set when main_loop() should exit when entering Ex mode.
+EXTERN int pending_exmode_active INIT(= FALSE);
+
EXTERN int ex_no_reprint INIT(= FALSE); // no need to print after z or p
EXTERN int reg_recording INIT(= 0); // register for recording or zero
diff --git a/src/testdir/test_ex_mode.vim b/src/testdir/test_ex_mode.vim
index bf10104984..910c1a6377 100644
--- a/src/testdir/test_ex_mode.vim
+++ b/src/testdir/test_ex_mode.vim
@@ -111,4 +111,12 @@ func Test_open_command()
close!
endfunc
+func Test_Ex_feedkeys()
+ " this doesn't do anything useful, just check it doesn't hang
+ new
+ call setline(1, ["foo"])
+ call feedkeys("Qg/foo/visual\<CR>", "xt")
+ bwipe!
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 2fbccd29a2..6793547688 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 274,
+/**/
273,
/**/
272,