Skip to content
forked from neovim/neovim

Commit

Permalink
Merge pull request neovim#18984 from neovim/fix-highlight-yank
Browse files Browse the repository at this point in the history
backport highlight.on_yank timer fixes neovim#18824 and neovim#18976
  • Loading branch information
clason committed Jun 16, 2022
2 parents 351b596 + fe42dea commit 05ce04e
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 8 deletions.
10 changes: 7 additions & 3 deletions runtime/lua/vim/_editor.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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:close()
timer:start(
timeout,
0,
vim.schedule_wrap(function()
if not timer:is_closing() then
timer:close()
end

fn()
end))
Expand Down
9 changes: 7 additions & 2 deletions runtime/lua/vim/highlight.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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("']")
Expand All @@ -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
Expand Down
15 changes: 12 additions & 3 deletions test/functional/lua/highlight_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit 05ce04e

Please sign in to comment.