From a7d0c04ccf8152b8e96cd131387fc467386b18a0 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 13 Mar 2026 21:13:57 -0400 Subject: [PATCH] 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. --- lua/diffs/highlight.lua | 11 +++++++++-- lua/diffs/init.lua | 5 ++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lua/diffs/highlight.lua b/lua/diffs/highlight.lua index ed9329b..1045d81 100644 --- a/lua/diffs/highlight.lua +++ b/lua/diffs/highlight.lua @@ -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 diff --git a/lua/diffs/init.lua b/lua/diffs/init.lua index b986eae..81d4f97 100644 --- a/lua/diffs/init.lua +++ b/lua/diffs/init.lua @@ -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