backport: fix(lua): verify buffer in highlight.on_yank (#15482)

Resolve an issue with deferred clearing of highlight failing if the
buffer is deleted before the timeout by checking whether the
buffer is valid first.
This commit is contained in:
notomo 2021-08-26 23:37:36 +09:00 committed by Sean Dewar
parent 6bda2f56eb
commit f7002337c0
No known key found for this signature in database
GPG Key ID: 08CC2C83AD41B581
2 changed files with 31 additions and 1 deletions

View File

@ -85,7 +85,11 @@ function highlight.on_yank(opts)
highlight.range(bufnr, yank_ns, higroup, pos1, pos2, event.regtype, event.inclusive)
vim.defer_fn(
function() api.nvim_buf_clear_namespace(bufnr, yank_ns, 0, -1) end,
function()
if api.nvim_buf_is_valid(bufnr) then
api.nvim_buf_clear_namespace(bufnr, yank_ns, 0, -1)
end
end,
timeout
)
end

View File

@ -0,0 +1,26 @@
local helpers = require('test.functional.helpers')(after_each)
local funcs = helpers.funcs
local exec_lua = helpers.exec_lua
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')
local bufnr = funcs.bufnr("%")
exec_lua[[
vim.highlight.on_yank({timeout = 10, on_macro = true, event = {operator = "y", regtype = "v"}})
vim.cmd('bwipeout!')
]]
exec_lua[[vim.wait(10)]]
local pattern = [[vim/highlight.lua:%d+: Invalid buffer id: ]] .. bufnr
local exists = pcall(helpers.assert_log, pattern)
assert.is_false(exists, string.format("%q should not be in log", pattern))
end)
end)