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:
parent
eccb4785ed
commit
803e08b6d5
3 changed files with 65 additions and 6 deletions
|
|
@ -397,7 +397,7 @@ describe('highlight', function()
|
|||
delete_buffer(bufnr)
|
||||
end)
|
||||
|
||||
it('line bg extmark survives adjacent clear_namespace starting at next row', function()
|
||||
it('nvim_buf_clear_namespace kills line bg extmark whose end_row bleeds into cleared range', function()
|
||||
local bufnr = create_buffer({
|
||||
'diff --git a/foo.py b/foo.py',
|
||||
'@@ -1,2 +1,2 @@',
|
||||
|
|
@ -423,6 +423,50 @@ describe('highlight', function()
|
|||
local last_body_row = hunk.start_line + #hunk.lines - 1
|
||||
vim.api.nvim_buf_clear_namespace(bufnr, ns, last_body_row + 1, last_body_row + 10)
|
||||
|
||||
local marks = vim.api.nvim_buf_get_extmarks(
|
||||
bufnr,
|
||||
ns,
|
||||
{ last_body_row, 0 },
|
||||
{ last_body_row, -1 },
|
||||
{ details = true }
|
||||
)
|
||||
local has_line_bg = false
|
||||
for _, mark in ipairs(marks) do
|
||||
if mark[4] and mark[4].hl_group == 'DiffsAdd' then
|
||||
has_line_bg = true
|
||||
end
|
||||
end
|
||||
assert.is_false(has_line_bg)
|
||||
delete_buffer(bufnr)
|
||||
end)
|
||||
|
||||
it('clear_ns_by_start preserves line bg extmark whose end_row bleeds past cleared range', function()
|
||||
local bufnr = create_buffer({
|
||||
'diff --git a/foo.py b/foo.py',
|
||||
'@@ -1,2 +1,2 @@',
|
||||
'-old',
|
||||
'+new',
|
||||
})
|
||||
|
||||
local hunk = {
|
||||
filename = 'foo.py',
|
||||
header_start_line = 1,
|
||||
start_line = 2,
|
||||
lines = { '-old', '+new' },
|
||||
prefix_width = 1,
|
||||
}
|
||||
|
||||
highlight.highlight_hunk(
|
||||
bufnr,
|
||||
ns,
|
||||
hunk,
|
||||
default_opts({ highlights = { background = true, treesitter = { enabled = false } } })
|
||||
)
|
||||
|
||||
local last_body_row = hunk.start_line + #hunk.lines - 1
|
||||
local clear_ns_by_start = require('diffs')._test.clear_ns_by_start
|
||||
clear_ns_by_start(bufnr, ns, last_body_row + 1, last_body_row + 10)
|
||||
|
||||
local marks = vim.api.nvim_buf_get_extmarks(
|
||||
bufnr,
|
||||
ns,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue