mirror of
https://github.com/neovim/neovim
synced 2025-07-16 09:11:51 +00:00
Merge pull request #18984 from neovim/fix-highlight-yank
backport highlight.on_yank timer fixes #18824 and #18976
This commit is contained in:
@ -373,9 +373,13 @@ end
|
||||
function vim.defer_fn(fn, timeout)
|
||||
vim.validate { fn = { fn, 'c', true}; }
|
||||
local timer = vim.loop.new_timer()
|
||||
timer:start(timeout, 0, vim.schedule_wrap(function()
|
||||
timer:stop()
|
||||
timer:start(
|
||||
timeout,
|
||||
0,
|
||||
vim.schedule_wrap(function()
|
||||
if not timer:is_closing() then
|
||||
timer:close()
|
||||
end
|
||||
|
||||
fn()
|
||||
end))
|
||||
|
@ -63,7 +63,8 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
|
||||
end
|
||||
end
|
||||
|
||||
local yank_ns = api.nvim_create_namespace("hlyank")
|
||||
local yank_ns = api.nvim_create_namespace('hlyank')
|
||||
local yank_timer
|
||||
--- Highlight the yanked region
|
||||
---
|
||||
--- use from init.vim via
|
||||
@ -113,6 +114,9 @@ function M.on_yank(opts)
|
||||
|
||||
local bufnr = api.nvim_get_current_buf()
|
||||
api.nvim_buf_clear_namespace(bufnr, yank_ns, 0, -1)
|
||||
if yank_timer then
|
||||
yank_timer:close()
|
||||
end
|
||||
|
||||
local pos1 = vim.fn.getpos("'[")
|
||||
local pos2 = vim.fn.getpos("']")
|
||||
@ -129,7 +133,8 @@ function M.on_yank(opts)
|
||||
{ regtype = event.regtype, inclusive = event.inclusive, priority = M.priorities.user }
|
||||
)
|
||||
|
||||
vim.defer_fn(function()
|
||||
yank_timer = vim.defer_fn(function()
|
||||
yank_timer = nil
|
||||
if api.nvim_buf_is_valid(bufnr) then
|
||||
api.nvim_buf_clear_namespace(bufnr, yank_ns, 0, -1)
|
||||
end
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user