From 179faa3edd6120a483b55aadf0a367fbf07b25fd Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Thu, 16 Jun 2022 18:51:36 +0800 Subject: fix(lua): clear got_int when calling vim.on_key() callback (#18979) --- src/nvim/lua/executor.c | 3 +++ test/functional/lua/vim_spec.lua | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c index 30ae274607..164542f4ab 100644 --- a/src/nvim/lua/executor.c +++ b/src/nvim/lua/executor.c @@ -1775,10 +1775,13 @@ void nlua_execute_on_key(int c) // [ vim, vim._on_key, buf ] lua_pushlstring(lstate, (const char *)buf, buf_len); + int save_got_int = got_int; + got_int = false; // avoid interrupts when the key typed is Ctrl-C if (nlua_pcall(lstate, 1, 0)) { nlua_error(lstate, _("Error executing vim.on_key Lua callback: %.*s")); } + got_int |= save_got_int; // [ vim ] lua_pop(lstate, 1); diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua index 861f85674f..1af46b7c2f 100644 --- a/test/functional/lua/vim_spec.lua +++ b/test/functional/lua/vim_spec.lua @@ -23,6 +23,7 @@ local mkdir_p = helpers.mkdir_p local rmdir = helpers.rmdir local write_file = helpers.write_file local expect_exit = helpers.expect_exit +local poke_eventloop = helpers.poke_eventloop describe('lua stdlib', function() before_each(clear) @@ -2268,6 +2269,22 @@ describe('lua stdlib', function() eq('iworld', exec_lua[[return table.concat(keys, '')]]) end) + + it('can call vim.fn functions on Ctrl-C #17273', function() + exec_lua([[ + _G.ctrl_c_cmdtype = '' + + vim.on_key(function(c) + if c == '\3' then + _G.ctrl_c_cmdtype = vim.fn.getcmdtype() + end + end) + ]]) + feed('/') + poke_eventloop() -- This is needed because Ctrl-C flushes input + feed('') + eq('/', exec_lua([[return _G.ctrl_c_cmdtype]])) + end) end) describe('vim.wait', function() -- cgit