diff options
-rw-r--r-- | runtime/lua/vim/_editor.lua | 4 | ||||
-rw-r--r-- | test/functional/lua/highlight_spec.lua | 15 |
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) |