# HG changeset patch # User Bram Moolenaar # Date 1582058704 -3600 # Node ID af9d5585cfbf3a24f12a1abed26fe408a64bc1a9 # Parent 686bc965b4b461f8bd275fd5fdc05f238662e6ec patch 8.2.0274: hang with combination of feedkeys(), Ex mode and :global Commit: https://github.com/vim/vim/commit/9e2bcb5d23138d45a0b6f9c1542b5facc807efe7 Author: Bram Moolenaar Date: Tue Feb 18 21:33:00 2020 +0100 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 --- 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 --- 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 --- a/src/globals.h +++ b/src/globals.h @@ -1028,6 +1028,10 @@ EXTERN int motion_force INIT(= 0); // mo * 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 --- 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 --- 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,