vim-patch:9.0.0051: using CTRL-C wih :append may hang Vim

Problem:    Using CTRL-C wih :append may hang Vim.
Solution:   Reset got_int. (closes vim/vim#10729, closes vim/vim#10728)
f754fe6a3d
This commit is contained in:
zeertzjq
2022-07-15 05:43:27 +08:00
parent 49d2256ae5
commit 45e2bbae83
3 changed files with 76 additions and 0 deletions

View File

@@ -1006,6 +1006,8 @@ static int command_line_check(VimState *state)
// that occurs while typing a command should // that occurs while typing a command should
// cause the command not to be executed. // cause the command not to be executed.
got_int = false; // avoid infinite Ctrl-C loop in Ex mode
cursorcmd(); // set the cursor on the right spot cursorcmd(); // set the cursor on the right spot
ui_cursor_shape(); ui_cursor_shape();
return 1; return 1;

View File

@@ -135,6 +135,29 @@ func Test_Ex_global()
bwipe! bwipe!
endfunc 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 " In Ex-mode, a backslash escapes a newline
func Test_Ex_escape_enter() func Test_Ex_escape_enter()
call feedkeys("gQlet l = \"a\\\<kEnter>b\"\<cr>vi\<cr>", 'xt') call feedkeys("gQlet l = \"a\\\<kEnter>b\"\<cr>vi\<cr>", 'xt')

View File

@@ -6,6 +6,7 @@ local eq = helpers.eq
local eval = helpers.eval local eval = helpers.eval
local feed = helpers.feed local feed = helpers.feed
local meths = helpers.meths local meths = helpers.meths
local sleep = helpers.sleep
before_each(clear) before_each(clear)
@@ -122,4 +123,54 @@ describe('Ex mode', function()
| |
]]) ]])
end) end)
it('pressing Ctrl-C in :append inside a loop in Ex mode does not hang', function()
local screen = Screen.new(60, 6)
screen:set_default_attr_ids({
[0] = {bold = true, reverse = true}, -- MsgSeparator
[1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText
})
screen:attach()
feed('gQ')
feed('for i in range(1)<CR>')
feed('append<CR>')
screen:expect([[
{0: }|
Entering Ex mode. Type "visual" to go to Normal mode. |
:for i in range(1) |
|
: append |
^ |
]])
feed('<C-C>')
sleep(10) -- Wait for Ctrl-C to flush input
feed('foo<CR>')
screen:expect([[
Entering Ex mode. Type "visual" to go to Normal mode. |
:for i in range(1) |
|
: append |
foo |
^ |
]])
feed('.<CR>')
screen:expect([[
:for i in range(1) |
|
: append |
foo |
. |
: ^ |
]])
feed('endfor<CR>')
feed('vi<CR>')
screen:expect([[
^foo |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
|
]])
end)
end) end)