From: Bram Moolenaar Date: Tue, 18 Feb 2020 20:33:00 +0000 (+0100) Subject: patch 8.2.0274: hang with combination of feedkeys(), Ex mode and :global X-Git-Tag: v8.2.0274 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9e2bcb5d23138d45a0b6f9c1542b5facc807efe7;p=vim patch 8.2.0274: hang with combination of feedkeys(), Ex mode and :global Problem: Hang with combination of feedkeys(), Ex mode and :global. (Yegappan Lakshmanan) Solution: Add the pending_exmode_active flag. --- diff --git a/src/ex_docmd.c b/src/ex_docmd.c index a819f6488..b78e5ac66 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 d056bcc5d..b828c27dd 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 bda75b486..fc551ba99 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 bf1010498..910c1a637 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\", "xt") + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 2fbccd29a..679354768 100644 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 274, /**/ 273, /**/