diff options
-rw-r--r-- | runtime/lua/vim/_editor.lua | 4 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter/highlighter.lua | 2 | ||||
-rw-r--r-- | runtime/scripts.vim | 4 | ||||
-rw-r--r-- | src/nvim/lua/executor.c | 3 | ||||
-rw-r--r-- | src/nvim/testdir/test_filetype.vim | 1 | ||||
-rw-r--r-- | test/functional/lua/highlight_spec.lua | 15 | ||||
-rw-r--r-- | test/functional/lua/vim_spec.lua | 17 |
7 files changed, 41 insertions, 5 deletions
diff --git a/runtime/lua/vim/_editor.lua b/runtime/lua/vim/_editor.lua index 453aa6ac81..f7dcc3a81b 100644 --- a/runtime/lua/vim/_editor.lua +++ b/runtime/lua/vim/_editor.lua @@ -408,7 +408,9 @@ function vim.defer_fn(fn, timeout) timeout, 0, vim.schedule_wrap(function() - timer:close() + if not timer:is_closing() then + timer:close() + end fn() end) diff --git a/runtime/lua/vim/treesitter/highlighter.lua b/runtime/lua/vim/treesitter/highlighter.lua index 453fed0576..d3da300e96 100644 --- a/runtime/lua/vim/treesitter/highlighter.lua +++ b/runtime/lua/vim/treesitter/highlighter.lua @@ -279,7 +279,7 @@ local function on_line_impl(self, buf, line) return end - if state.iter == nil then + if state.iter == nil or state.next_row < line then state.iter = highlighter_query:query():iter_captures(root_node, self.bufnr, line, root_end_row + 1) end diff --git a/runtime/scripts.vim b/runtime/scripts.vim index dd47f65ba0..36763a4a82 100644 --- a/runtime/scripts.vim +++ b/runtime/scripts.vim @@ -202,6 +202,10 @@ if s:line1 =~# "^#!" elseif s:name =~# 'gforth\>' set ft=forth + " Icon + elseif s:name =~# 'icon\>' + set ft=icon + endif unlet s:name 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/src/nvim/testdir/test_filetype.vim b/src/nvim/testdir/test_filetype.vim index fb6c9e46aa..3c05045dd3 100644 --- a/src/nvim/testdir/test_filetype.vim +++ b/src/nvim/testdir/test_filetype.vim @@ -717,6 +717,7 @@ let s:script_checks = { \ 'routeros': [['#!/path/rsc']], \ 'fish': [['#!/path/fish']], \ 'forth': [['#!/path/gforth']], + \ 'icon': [['#!/path/icon']], \ } " Various forms of "env" optional arguments. diff --git a/test/functional/lua/highlight_spec.lua b/test/functional/lua/highlight_spec.lua index 50eecb5d09..60d0ed5017 100644 --- a/test/functional/lua/highlight_spec.lua +++ b/test/functional/lua/highlight_spec.lua @@ -6,20 +6,29 @@ local command = helpers.command local clear = helpers.clear describe('vim.highlight.on_yank', function() - before_each(function() clear() end) it('does not show errors even if buffer is wiped before timeout', function() command('new') - exec_lua[[ + exec_lua([[ vim.highlight.on_yank({timeout = 10, on_macro = true, event = {operator = "y", regtype = "v"}}) vim.cmd('bwipeout!') - ]] + ]]) helpers.sleep(10) helpers.feed('<cr>') -- avoid hang if error message exists eq('', eval('v:errmsg')) end) + it('does not close timer twice', function() + exec_lua([[ + vim.highlight.on_yank({timeout = 10, on_macro = true, event = {operator = "y"}}) + vim.loop.sleep(10) + vim.schedule(function() + vim.highlight.on_yank({timeout = 0, on_macro = true, event = {operator = "y"}}) + end) + ]]) + eq('', eval('v:errmsg')) + end) end) 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<ESC>', 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('<C-C>') + eq('/', exec_lua([[return _G.ctrl_c_cmdtype]])) + end) end) describe('vim.wait', function() |