summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-07-14 17:06:12 +0100
committerBram Moolenaar <Bram@vim.org>2022-07-14 17:06:12 +0100
commitf754fe6a3d5384b5146c38a32db6da9d46e00c40 (patch)
treeac33c0dc436f941ebe1d00396d4f7a22ee1d3908
parentb26592a84c8f578c8fbe83cf02ebb47453de1683 (diff)
downloadvim-git-f754fe6a3d5384b5146c38a32db6da9d46e00c40.tar.gz
patch 9.0.0051: using CTRL-C wih :append may hang Vimv9.0.0051
Problem: Using CTRL-C wih :append may hang Vim. Solution: Reset got_int. (closes #10729, closes #10728)
-rw-r--r--src/ex_getln.c2
-rw-r--r--src/testdir/test_ex_mode.vim23
-rw-r--r--src/version.c2
3 files changed, 27 insertions, 0 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 8dc03dc33..dd538941e 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -1786,6 +1786,8 @@ getcmdline_int(
// that occurs while typing a command should
// cause the command not to be executed.
+ got_int = FALSE; // avoid infinite Ctrl-C loop in Ex mode
+
// Trigger SafeState if nothing is pending.
may_trigger_safestate(xpc.xp_numfiles <= 0);
diff --git a/src/testdir/test_ex_mode.vim b/src/testdir/test_ex_mode.vim
index fafdda8de..50bc1db99 100644
--- a/src/testdir/test_ex_mode.vim
+++ b/src/testdir/test_ex_mode.vim
@@ -145,6 +145,29 @@ func Test_Ex_global()
bwipe!
endfunc
+" Test for pressing Ctrl-C in :append inside a loop in Ex mode
+" This used to hang Vim
+func Test_Ex_append_in_loop()
+ CheckRunVimInTerminal
+ let buf = RunVimInTerminal('', {'rows': 6})
+
+ call term_sendkeys(buf, "gQ")
+ call term_sendkeys(buf, "for i in range(1)\<CR>")
+ call term_sendkeys(buf, "append\<CR>")
+ call WaitForAssert({-> assert_match(': append', term_getline(buf, 5))}, 1000)
+ call term_sendkeys(buf, "\<C-C>")
+ call term_wait(buf)
+ call term_sendkeys(buf, "foo\<CR>")
+ call WaitForAssert({-> assert_match('foo', term_getline(buf, 5))}, 1000)
+ call term_sendkeys(buf, ".\<CR>")
+ call WaitForAssert({-> assert_match('.', term_getline(buf, 5))}, 1000)
+ call term_sendkeys(buf, "endfor\<CR>")
+ call term_sendkeys(buf, "vi\<CR>")
+ call WaitForAssert({-> assert_match('foo', term_getline(buf, 1))}, 1000)
+
+ call StopVimInTerminal(buf)
+endfunc
+
" In Ex-mode, a backslash escapes a newline
func Test_Ex_escape_enter()
call feedkeys("gQlet l = \"a\\\<kEnter>b\"\<cr>vi\<cr>", 'xt')
diff --git a/src/version.c b/src/version.c
index 8df434140..a6a80b671 100644
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 51,
+/**/
50,
/**/
49,