fix(highlight): use multiline extmark for hl_eol with start-position clearing

Problem: single-row extmarks (`end_row = buf_line, end_col = len`) do
not trigger `hl_eol` — Neovim requires `end_row > start_row`. Line
backgrounds stopped at the last character instead of extending to the
window edge.

Solution: use `end_row = buf_line + 1, end_col = 0` for line bg
extmarks. Replace per-hunk `nvim_buf_clear_namespace` with
`clear_ns_by_start` that queries extmarks by start position only,
so adjacent hunks' trailing `end_row` is never killed.
This commit is contained in:
Barrett Ruth 2026-03-15 12:35:30 -04:00
parent 7e4196e997
commit 3bf41c2af3
Signed by: barrett
GPG key ID: A6C96C9349D2FC81
3 changed files with 65 additions and 6 deletions

View file

@ -437,7 +437,10 @@ local function ensure_cache(bufnr)
if config.highlights.context.enabled then
compute_hunk_context(hunks, config.highlights.context.lines)
end
local carried = entry and not entry.pending_clear and carry_forward_highlighted(entry, hunks)
local carried = entry
and not entry.pending_clear
and #entry.hunks == #hunks
and carry_forward_highlighted(entry, hunks)
hunk_cache[bufnr] = {
hunks = hunks,
tick = tick,
@ -514,6 +517,18 @@ local function find_visible_hunks(hunks, toprow, botrow)
return first, last
end
---@param bufnr integer
---@param ns_id integer
---@param start_row integer
---@param end_row integer
local function clear_ns_by_start(bufnr, ns_id, start_row, end_row)
local marks =
vim.api.nvim_buf_get_extmarks(bufnr, ns_id, { start_row, 0 }, { end_row - 1, 2147483647 }, {})
for _, m in ipairs(marks) do
vim.api.nvim_buf_del_extmark(bufnr, ns_id, m[1])
end
end
local function compute_highlight_groups(is_default)
local normal = vim.api.nvim_get_hl(0, { name = 'Normal' })
local diff_add = vim.api.nvim_get_hl(0, { name = 'DiffAdd' })
@ -945,7 +960,7 @@ local function init()
if hunk.header_start_line then
clear_start = hunk.header_start_line - 1
end
vim.api.nvim_buf_clear_namespace(bufnr, ns, clear_start, clear_end)
clear_ns_by_start(bufnr, ns, clear_start, clear_end)
highlight.highlight_hunk(bufnr, ns, hunk, fast_hl_opts)
entry.highlighted[i] = true
count = count + 1
@ -1185,6 +1200,7 @@ M._test = {
invalidate_cache = invalidate_cache,
hunks_eq = hunks_eq,
process_pending_clear = process_pending_clear,
clear_ns_by_start = clear_ns_by_start,
ft_retry_pending = ft_retry_pending,
compute_hunk_context = compute_hunk_context,
compute_highlight_groups = compute_highlight_groups,