fix(highlight): make intra-line bg visible under line backgrounds

Problem: `line_hl_group` bg unconditionally overrides `hl_group` bg
regardless of priority (neovim/neovim#31151). `DiffsAddText`/
`DiffsDeleteText` at p201 were invisible under `DiffsAdd`/`DiffsDelete`
`line_hl_group` at p200 because they operate on separate stacking layers.

Solution: replace `line_hl_group` with `hl_group` + `hl_eol` +
`end_row` for line backgrounds, putting them on the same layer as
intra-line highlights so priority governs stacking. Split
`number_hl_group` into a separate extmark to prevent gutter bleed via
`end_row`. Use raw `DiffAdd.bg`/`DiffDelete.bg` for `DiffsAddText`/
`DiffsDeleteText` instead of alpha-blending toward Normal.bg, which
produced indistinguishable colors on dark themes.
This commit is contained in:
Barrett Ruth 2026-03-13 21:13:57 -04:00
parent a1af48833b
commit a7d0c04ccf
2 changed files with 11 additions and 5 deletions

View file

@ -637,10 +637,17 @@ function M.highlight_hunk(bufnr, ns, hunk, opts)
if opts.highlights.background and is_diff_line then
pcall(vim.api.nvim_buf_set_extmark, bufnr, ns, buf_line, 0, {
line_hl_group = line_hl,
number_hl_group = opts.highlights.gutter and number_hl or nil,
end_row = buf_line + 1,
hl_group = line_hl,
hl_eol = true,
priority = p.line_bg,
})
if opts.highlights.gutter then
pcall(vim.api.nvim_buf_set_extmark, bufnr, ns, buf_line, 0, {
number_hl_group = number_hl,
priority = p.line_bg,
})
end
end
if is_marker and line_len > pw then

View file

@ -543,11 +543,10 @@ local function compute_highlight_groups(is_default)
local normal_fg = normal.fg or (dark and 0xcccccc or 0x333333)
local alpha = config.highlights.blend_alpha or 0.6
local text_alpha = math.min(alpha + 0.3, 1.0)
local blended_add = blend_color(add_bg, bg, alpha)
local blended_del = blend_color(del_bg, bg, alpha)
local blended_add_text = blend_color(add_bg, bg, text_alpha)
local blended_del_text = blend_color(del_bg, bg, text_alpha)
local blended_add_text = add_bg
local blended_del_text = del_bg
local clear_hl = { default = dflt, fg = normal_fg }
if not transparent then