mirror of
https://github.com/neovim/neovim
synced 2025-07-26 00:01:46 +00:00
fix(lua): don't clamp -1 or v:maxcol in vim.highlight.range() (#29203)
This commit is contained in:
@ -49,10 +49,22 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
|
|||||||
local priority = opts.priority or M.priorities.user
|
local priority = opts.priority or M.priorities.user
|
||||||
local scoped = opts._scoped or false
|
local scoped = opts._scoped or false
|
||||||
|
|
||||||
|
local v_maxcol = vim.v.maxcol
|
||||||
|
|
||||||
local pos1 = type(start) == 'string' and vim.fn.getpos(start)
|
local pos1 = type(start) == 'string' and vim.fn.getpos(start)
|
||||||
or { bufnr, start[1] + 1, start[2] + 1, 0 }
|
or {
|
||||||
|
bufnr,
|
||||||
|
start[1] + 1,
|
||||||
|
start[2] ~= -1 and start[2] ~= v_maxcol and start[2] + 1 or v_maxcol,
|
||||||
|
0,
|
||||||
|
}
|
||||||
local pos2 = type(finish) == 'string' and vim.fn.getpos(finish)
|
local pos2 = type(finish) == 'string' and vim.fn.getpos(finish)
|
||||||
or { bufnr, finish[1] + 1, finish[2] + 1, 0 }
|
or {
|
||||||
|
bufnr,
|
||||||
|
finish[1] + 1,
|
||||||
|
finish[2] ~= -1 and start[2] ~= v_maxcol and finish[2] + 1 or v_maxcol,
|
||||||
|
0,
|
||||||
|
}
|
||||||
|
|
||||||
local buf_line_count = vim.api.nvim_buf_line_count(bufnr)
|
local buf_line_count = vim.api.nvim_buf_line_count(bufnr)
|
||||||
pos1[2] = math.min(pos1[2], buf_line_count)
|
pos1[2] = math.min(pos1[2], buf_line_count)
|
||||||
@ -63,10 +75,14 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
|
|||||||
end
|
end
|
||||||
|
|
||||||
vim.api.nvim_buf_call(bufnr, function()
|
vim.api.nvim_buf_call(bufnr, function()
|
||||||
|
if pos1[3] ~= v_maxcol then
|
||||||
local max_col1 = vim.fn.col({ pos1[2], '$' })
|
local max_col1 = vim.fn.col({ pos1[2], '$' })
|
||||||
pos1[3] = math.min(pos1[3], max_col1)
|
pos1[3] = math.min(pos1[3], max_col1)
|
||||||
|
end
|
||||||
|
if pos2[3] ~= v_maxcol then
|
||||||
local max_col2 = vim.fn.col({ pos2[2], '$' })
|
local max_col2 = vim.fn.col({ pos2[2], '$' })
|
||||||
pos2[3] = math.min(pos2[3], max_col2)
|
pos2[3] = math.min(pos2[3], max_col2)
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local region = vim.fn.getregionpos(pos1, pos2, {
|
local region = vim.fn.getregionpos(pos1, pos2, {
|
||||||
@ -77,6 +93,14 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
|
|||||||
-- For non-blockwise selection, use a single extmark.
|
-- For non-blockwise selection, use a single extmark.
|
||||||
if regtype == 'v' or regtype == 'V' then
|
if regtype == 'v' or regtype == 'V' then
|
||||||
region = { { region[1][1], region[#region][2] } }
|
region = { { region[1][1], region[#region][2] } }
|
||||||
|
if
|
||||||
|
regtype == 'V'
|
||||||
|
or region[1][2][2] == pos1[2] and pos1[3] == v_maxcol
|
||||||
|
or region[1][2][2] == pos2[2] and pos2[3] == v_maxcol
|
||||||
|
then
|
||||||
|
region[1][2][2] = region[1][2][2] + 1
|
||||||
|
region[1][2][3] = 0
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for _, res in ipairs(region) do
|
for _, res in ipairs(region) do
|
||||||
@ -84,10 +108,6 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
|
|||||||
local start_col = res[1][3] - 1
|
local start_col = res[1][3] - 1
|
||||||
local end_row = res[2][2] - 1
|
local end_row = res[2][2] - 1
|
||||||
local end_col = res[2][3]
|
local end_col = res[2][3]
|
||||||
if regtype == 'V' then
|
|
||||||
end_row = end_row + 1
|
|
||||||
end_col = 0
|
|
||||||
end
|
|
||||||
api.nvim_buf_set_extmark(bufnr, ns, start_row, start_col, {
|
api.nvim_buf_set_extmark(bufnr, ns, start_row, start_col, {
|
||||||
hl_group = higroup,
|
hl_group = higroup,
|
||||||
end_row = end_row,
|
end_row = end_row,
|
||||||
|
@ -90,6 +90,22 @@ describe('vim.highlight.range', function()
|
|||||||
|
|
|
|
||||||
]])
|
]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('can use -1 or v:maxcol to indicate end of line', function()
|
||||||
|
exec_lua([[
|
||||||
|
local ns = vim.api.nvim_create_namespace('')
|
||||||
|
vim.highlight.range(0, ns, 'Search', { 0, 4 }, { 1, -1 }, {})
|
||||||
|
vim.highlight.range(0, ns, 'Search', { 2, 6 }, { 3, vim.v.maxcol }, {})
|
||||||
|
]])
|
||||||
|
screen:expect([[
|
||||||
|
^asdf{10:ghjkl}{100:$} |
|
||||||
|
{10:«口=口»}{100:$} |
|
||||||
|
qwerty{10:uiop}{100:$} |
|
||||||
|
{10:口口=口口}{1:$} |
|
||||||
|
zxcvbnm{1:$} |
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('vim.highlight.on_yank', function()
|
describe('vim.highlight.on_yank', function()
|
||||||
|
Reference in New Issue
Block a user