aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/highlight.lua
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-06-05 16:47:43 +0800
committerGitHub <noreply@github.com>2024-06-05 16:47:43 +0800
commit43bd9c9c1cacb2f069c7e84330a608623c874d74 (patch)
treed349204e2fb9470136471cfb3b66b25fbabbd93c /runtime/lua/vim/highlight.lua
parente41597c510b4708c3192aa7573137e0fe9468a3a (diff)
downloadrneovim-43bd9c9c1cacb2f069c7e84330a608623c874d74.tar.gz
rneovim-43bd9c9c1cacb2f069c7e84330a608623c874d74.tar.bz2
rneovim-43bd9c9c1cacb2f069c7e84330a608623c874d74.zip
fix(lua): don't clamp -1 or v:maxcol in vim.highlight.range() (#29203)
Diffstat (limited to 'runtime/lua/vim/highlight.lua')
-rw-r--r--runtime/lua/vim/highlight.lua40
1 files changed, 30 insertions, 10 deletions
diff --git a/runtime/lua/vim/highlight.lua b/runtime/lua/vim/highlight.lua
index 89298ce568..e972ffaa8c 100644
--- a/runtime/lua/vim/highlight.lua
+++ b/runtime/lua/vim/highlight.lua
@@ -49,10 +49,22 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
local priority = opts.priority or M.priorities.user
local scoped = opts._scoped or false
+ local v_maxcol = vim.v.maxcol
+
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)
- 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)
pos1[2] = math.min(pos1[2], buf_line_count)
@@ -63,10 +75,14 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
end
vim.api.nvim_buf_call(bufnr, function()
- local max_col1 = vim.fn.col({ pos1[2], '$' })
- pos1[3] = math.min(pos1[3], max_col1)
- local max_col2 = vim.fn.col({ pos2[2], '$' })
- pos2[3] = math.min(pos2[3], max_col2)
+ if pos1[3] ~= v_maxcol then
+ local max_col1 = vim.fn.col({ pos1[2], '$' })
+ pos1[3] = math.min(pos1[3], max_col1)
+ end
+ if pos2[3] ~= v_maxcol then
+ local max_col2 = vim.fn.col({ pos2[2], '$' })
+ pos2[3] = math.min(pos2[3], max_col2)
+ end
end)
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.
if regtype == 'v' or regtype == 'V' then
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
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 end_row = res[2][2] - 1
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, {
hl_group = higroup,
end_row = end_row,