diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c index 4348789cb2..0c9c874477 100644 --- a/src/nvim/drawline.c +++ b/src/nvim/drawline.c @@ -2924,7 +2924,25 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, b if (wlv.filler_todo <= 0) { // Apply lowest-priority line attr now, so everything can override it. - wlv.char_attr = hl_combine_attr(wlv.line_attr_lowprio, wlv.char_attr); + int low = wlv.line_attr_lowprio; + int high = wlv.char_attr; + + if (wlv.line_attr_lowprio != 0) { + HlAttrs line_ae = syn_attr2entry(wlv.line_attr_lowprio); + HlAttrs char_ae = syn_attr2entry(wlv.char_attr); + // If line has background (CursorLine) and char's background equals Normal's background, + // reverse the combination order to let CursorLine override normal_bg. + bool has_line_bg = line_ae.rgb_bg_color >= 0 || line_ae.cterm_bg_color > 0; + bool char_is_normal_bg = ui_rgb_attached() + ? (char_ae.rgb_bg_color == normal_bg) + : (char_ae.cterm_bg_color == cterm_normal_bg_color); + + if (has_line_bg && char_is_normal_bg) { + low = wlv.char_attr; + high = wlv.line_attr_lowprio; + } + } + wlv.char_attr = hl_combine_attr(low, high); } if (wlv.filler_todo <= 0) { diff --git a/test/functional/ui/highlight_spec.lua b/test/functional/ui/highlight_spec.lua index af9add727a..9780885028 100644 --- a/test/functional/ui/highlight_spec.lua +++ b/test/functional/ui/highlight_spec.lua @@ -1378,6 +1378,23 @@ describe('CursorLine and CursorLineNr highlights', function() | ]]) end) + + it('CursorLine overlays hl group linked to Normal', function() + local screen = Screen.new(50, 12) + screen:add_extra_attr_ids({ + [101] = { background = Screen.colors.Grey90, foreground = Screen.colors.Gray100 }, + }) + command('hi Normal guibg=black guifg=white') + command('hi def link Test Normal') + feed('ifoo bar') + feed(':call matchadd("Test", "bar")') + command('set cursorline') + screen:expect([[ + {21:foo }{101:ba^r}{21: }| + {1:~ }|*10 + :call matchadd("Test", "bar") | + ]]) + end) end) describe('CursorColumn highlight', function()