mirror of
https://github.com/neovim/neovim
synced 2025-07-18 02:01:46 +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)
|
function vim.defer_fn(fn, timeout)
|
||||||
vim.validate { fn = { fn, 'c', true}; }
|
vim.validate { fn = { fn, 'c', true}; }
|
||||||
local timer = vim.loop.new_timer()
|
local timer = vim.loop.new_timer()
|
||||||
timer:start(timeout, 0, vim.schedule_wrap(function()
|
timer:start(
|
||||||
timer:stop()
|
timeout,
|
||||||
|
0,
|
||||||
|
vim.schedule_wrap(function()
|
||||||
|
if not timer:is_closing() then
|
||||||
timer:close()
|
timer:close()
|
||||||
|
end
|
||||||
|
|
||||||
fn()
|
fn()
|
||||||
end))
|
end))
|
||||||
|
@ -63,7 +63,8 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
|
|||||||
end
|
end
|
||||||
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
|
--- Highlight the yanked region
|
||||||
---
|
---
|
||||||
--- use from init.vim via
|
--- use from init.vim via
|
||||||
@ -113,6 +114,9 @@ function M.on_yank(opts)
|
|||||||
|
|
||||||
local bufnr = api.nvim_get_current_buf()
|
local bufnr = api.nvim_get_current_buf()
|
||||||
api.nvim_buf_clear_namespace(bufnr, yank_ns, 0, -1)
|
api.nvim_buf_clear_namespace(bufnr, yank_ns, 0, -1)
|
||||||
|
if yank_timer then
|
||||||
|
yank_timer:close()
|
||||||
|
end
|
||||||
|
|
||||||
local pos1 = vim.fn.getpos("'[")
|
local pos1 = vim.fn.getpos("'[")
|
||||||
local pos2 = 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 }
|
{ 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
|
if api.nvim_buf_is_valid(bufnr) then
|
||||||
api.nvim_buf_clear_namespace(bufnr, yank_ns, 0, -1)
|
api.nvim_buf_clear_namespace(bufnr, yank_ns, 0, -1)
|
||||||
end
|
end
|
||||||
|
@ -6,20 +6,29 @@ local command = helpers.command
|
|||||||
local clear = helpers.clear
|
local clear = helpers.clear
|
||||||
|
|
||||||
describe('vim.highlight.on_yank', function()
|
describe('vim.highlight.on_yank', function()
|
||||||
|
|
||||||
before_each(function()
|
before_each(function()
|
||||||
clear()
|
clear()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('does not show errors even if buffer is wiped before timeout', function()
|
it('does not show errors even if buffer is wiped before timeout', function()
|
||||||
command('new')
|
command('new')
|
||||||
exec_lua[[
|
exec_lua([[
|
||||||
vim.highlight.on_yank({timeout = 10, on_macro = true, event = {operator = "y", regtype = "v"}})
|
vim.highlight.on_yank({timeout = 10, on_macro = true, event = {operator = "y", regtype = "v"}})
|
||||||
vim.cmd('bwipeout!')
|
vim.cmd('bwipeout!')
|
||||||
]]
|
]])
|
||||||
helpers.sleep(10)
|
helpers.sleep(10)
|
||||||
helpers.feed('<cr>') -- avoid hang if error message exists
|
helpers.feed('<cr>') -- avoid hang if error message exists
|
||||||
eq('', eval('v:errmsg'))
|
eq('', eval('v:errmsg'))
|
||||||
end)
|
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)
|
end)
|
||||||
|
Reference in New Issue
Block a user