diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-02-18 21:33:00 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-02-18 21:33:00 +0100 |
commit | 9e2bcb5d23138d45a0b6f9c1542b5facc807efe7 (patch) | |
tree | a235c3311892fd24aafa6137c36d41e71b9b1640 /src | |
parent | 1fa8d2c33d7290eda7dc2a94d4ec6a599a2d61dd (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.
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_docmd.c | 2 | ||||
-rw-r--r-- | src/getchar.c | 4 | ||||
-rw-r--r-- | src/globals.h | 4 | ||||
-rw-r--r-- | src/testdir/test_ex_mode.vim | 8 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |