mirror of
https://github.com/neovim/neovim.git
synced 2024-12-23 20:55:18 -07:00
fix(lua): make highlight.on_yank use win-local highlight (#27349)
Currently, highlight.on_yank() does buffer-local highlighting, this PR makes it window scoped. Also fix the problem that when yanking in a buffer, moving to another buffer, and yanking before the original buffer highlight disappears, the original buffer highlight won't disappear on timeout.
This commit is contained in:
parent
4ec5c58846
commit
e2e63bd045
@ -55,6 +55,7 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
|
|||||||
local regtype = opts.regtype or 'v'
|
local regtype = opts.regtype or 'v'
|
||||||
local inclusive = opts.inclusive or false
|
local inclusive = opts.inclusive or false
|
||||||
local priority = opts.priority or M.priorities.user
|
local priority = opts.priority or M.priorities.user
|
||||||
|
local scoped = opts._scoped or false
|
||||||
|
|
||||||
-- TODO: in case of 'v', 'V' (not block), this should calculate equivalent
|
-- TODO: in case of 'v', 'V' (not block), this should calculate equivalent
|
||||||
-- bounds (row, col, end_row, end_col) as multiline regions are natively
|
-- bounds (row, col, end_row, end_col) as multiline regions are natively
|
||||||
@ -72,12 +73,14 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
|
|||||||
end_col = cols[2],
|
end_col = cols[2],
|
||||||
priority = priority,
|
priority = priority,
|
||||||
strict = false,
|
strict = false,
|
||||||
|
scoped = scoped,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local yank_ns = api.nvim_create_namespace('hlyank')
|
local yank_ns = api.nvim_create_namespace('hlyank')
|
||||||
local yank_timer
|
local yank_timer
|
||||||
|
local yank_cancel
|
||||||
|
|
||||||
--- Highlight the yanked text
|
--- Highlight the yanked text
|
||||||
---
|
---
|
||||||
@ -120,24 +123,29 @@ function M.on_yank(opts)
|
|||||||
local higroup = opts.higroup or 'IncSearch'
|
local higroup = opts.higroup or 'IncSearch'
|
||||||
local timeout = opts.timeout or 150
|
local timeout = opts.timeout or 150
|
||||||
|
|
||||||
local bufnr = api.nvim_get_current_buf()
|
local bufnr = vim.api.nvim_get_current_buf()
|
||||||
api.nvim_buf_clear_namespace(bufnr, yank_ns, 0, -1)
|
local winid = vim.api.nvim_get_current_win()
|
||||||
if yank_timer then
|
if yank_timer then
|
||||||
yank_timer:close()
|
yank_timer:close()
|
||||||
|
yank_cancel()
|
||||||
end
|
end
|
||||||
|
|
||||||
M.range(bufnr, yank_ns, higroup, "'[", "']", {
|
M.range(bufnr, yank_ns, higroup, "'[", "']", {
|
||||||
regtype = event.regtype,
|
regtype = event.regtype,
|
||||||
inclusive = event.inclusive,
|
inclusive = event.inclusive,
|
||||||
priority = opts.priority or M.priorities.user,
|
priority = opts.priority or M.priorities.user,
|
||||||
|
_scoped = true,
|
||||||
})
|
})
|
||||||
|
vim.api.nvim_win_add_ns(winid, yank_ns)
|
||||||
|
|
||||||
yank_timer = vim.defer_fn(function()
|
yank_cancel = function()
|
||||||
yank_timer = nil
|
yank_timer = nil
|
||||||
if api.nvim_buf_is_valid(bufnr) then
|
yank_cancel = nil
|
||||||
api.nvim_buf_clear_namespace(bufnr, yank_ns, 0, -1)
|
pcall(vim.api.nvim_buf_clear_namespace, bufnr, yank_ns, 0, -1)
|
||||||
end
|
pcall(vim.api.nvim_win_remove_ns, winid, yank_ns)
|
||||||
end, timeout)
|
end
|
||||||
|
|
||||||
|
yank_timer = vim.defer_fn(yank_cancel, timeout)
|
||||||
end
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
local helpers = require('test.functional.helpers')(after_each)
|
local helpers = require('test.functional.helpers')(after_each)
|
||||||
local exec_lua = helpers.exec_lua
|
local exec_lua = helpers.exec_lua
|
||||||
local eq = helpers.eq
|
local eq = helpers.eq
|
||||||
|
local neq = helpers.neq
|
||||||
local eval = helpers.eval
|
local eval = helpers.eval
|
||||||
local command = helpers.command
|
local command = helpers.command
|
||||||
local clear = helpers.clear
|
local clear = helpers.clear
|
||||||
|
local api = helpers.api
|
||||||
|
|
||||||
describe('vim.highlight.on_yank', function()
|
describe('vim.highlight.on_yank', function()
|
||||||
before_each(function()
|
before_each(function()
|
||||||
@ -31,4 +33,34 @@ describe('vim.highlight.on_yank', function()
|
|||||||
]])
|
]])
|
||||||
eq('', eval('v:errmsg'))
|
eq('', eval('v:errmsg'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('does not show in another window', function()
|
||||||
|
command('vsplit')
|
||||||
|
exec_lua([[
|
||||||
|
vim.api.nvim_buf_set_mark(0,"[",1,1,{})
|
||||||
|
vim.api.nvim_buf_set_mark(0,"]",1,1,{})
|
||||||
|
vim.highlight.on_yank({timeout = math.huge, on_macro = true, event = {operator = "y"}})
|
||||||
|
]])
|
||||||
|
neq({}, api.nvim_win_get_ns(0))
|
||||||
|
command('wincmd w')
|
||||||
|
eq({}, api.nvim_win_get_ns(0))
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('removes old highlight if new one is created before old one times out', function()
|
||||||
|
command('vnew')
|
||||||
|
exec_lua([[
|
||||||
|
vim.api.nvim_buf_set_mark(0,"[",1,1,{})
|
||||||
|
vim.api.nvim_buf_set_mark(0,"]",1,1,{})
|
||||||
|
vim.highlight.on_yank({timeout = math.huge, on_macro = true, event = {operator = "y"}})
|
||||||
|
]])
|
||||||
|
neq({}, api.nvim_win_get_ns(0))
|
||||||
|
command('wincmd w')
|
||||||
|
exec_lua([[
|
||||||
|
vim.api.nvim_buf_set_mark(0,"[",1,1,{})
|
||||||
|
vim.api.nvim_buf_set_mark(0,"]",1,1,{})
|
||||||
|
vim.highlight.on_yank({timeout = math.huge, on_macro = true, event = {operator = "y"}})
|
||||||
|
]])
|
||||||
|
command('wincmd w')
|
||||||
|
eq({}, api.nvim_win_get_ns(0))
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
Loading…
Reference in New Issue
Block a user