aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/lua/vim/_editor.lua4
-rw-r--r--runtime/lua/vim/treesitter/highlighter.lua2
-rw-r--r--runtime/scripts.vim4
-rw-r--r--src/nvim/lua/executor.c3
-rw-r--r--src/nvim/testdir/test_filetype.vim1
-rw-r--r--test/functional/lua/highlight_spec.lua15
-rw-r--r--test/functional/lua/vim_spec.lua17
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()