aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/lua/vim/_editor.lua4
-rw-r--r--test/functional/lua/highlight_spec.lua15
2 files changed, 15 insertions, 4 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/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)