diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-10-08 06:24:36 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-08 06:24:36 +0800 |
commit | 376de1483ee5380aaf5d2b6bb93d6ba245bfc329 (patch) | |
tree | 7dcc9784f8ada315402e51559a04163f3697d1da | |
parent | 88085c2e80a7e3ac29aabb6b5420377eed99b8b6 (diff) | |
download | rneovim-376de1483ee5380aaf5d2b6bb93d6ba245bfc329.tar.gz rneovim-376de1483ee5380aaf5d2b6bb93d6ba245bfc329.tar.bz2 rneovim-376de1483ee5380aaf5d2b6bb93d6ba245bfc329.zip |
fix(drawline): correct highlight priority with Visual selection (#30706)
-rw-r--r-- | src/nvim/drawline.c | 50 | ||||
-rw-r--r-- | test/functional/ui/decorations_spec.lua | 2 | ||||
-rw-r--r-- | test/functional/ui/fold_spec.lua | 16 | ||||
-rw-r--r-- | test/functional/ui/spell_spec.lua | 31 |
4 files changed, 55 insertions, 44 deletions
diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c index 3b88dd2e90..79f3298eb4 100644 --- a/src/nvim/drawline.c +++ b/src/nvim/drawline.c @@ -927,7 +927,8 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s bool noinvcur = false; // don't invert the cursor bool lnum_in_visual_area = false; - bool attr_pri = false; // char_attr has priority + int char_attr_pri = 0; // attributes with high priority + int char_attr_base = 0; // attributes with low priority bool area_highlighting = false; // Visual or incsearch highlighting in this line int vi_attr = 0; // attributes for Visual and incsearch highlighting int area_attr = 0; // attributes desired by highlighting @@ -1741,16 +1742,14 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s } // Decide which of the highlight attributes to use. - attr_pri = true; - if (area_attr != 0) { - wlv.char_attr = hl_combine_attr(wlv.line_attr, area_attr); + char_attr_pri = hl_combine_attr(wlv.line_attr, area_attr); if (!highlight_match) { // let search highlight show in Visual area if possible - wlv.char_attr = hl_combine_attr(search_attr, wlv.char_attr); + char_attr_pri = hl_combine_attr(search_attr, char_attr_pri); } } else if (search_attr != 0) { - wlv.char_attr = hl_combine_attr(wlv.line_attr, search_attr); + char_attr_pri = hl_combine_attr(wlv.line_attr, search_attr); } else if (wlv.line_attr != 0 && ((wlv.fromcol == -10 && wlv.tocol == MAXCOL) || wlv.vcol < wlv.fromcol @@ -1758,15 +1757,12 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s || wlv.vcol >= wlv.tocol)) { // Use wlv.line_attr when not in the Visual or 'incsearch' area // (area_attr may be 0 when "noinvcur" is set). - wlv.char_attr = wlv.line_attr; + char_attr_pri = wlv.line_attr; } else { - attr_pri = false; - wlv.char_attr = decor_attr; - } - - if (folded_attr != 0) { - wlv.char_attr = hl_combine_attr(folded_attr, wlv.char_attr); + char_attr_pri = 0; } + char_attr_base = hl_combine_attr(folded_attr, decor_attr); + wlv.char_attr = hl_combine_attr(char_attr_base, char_attr_pri); } if (draw_folded && has_foldtext && wlv.n_extra == 0 && wlv.col == win_col_offset) { @@ -1997,25 +1993,8 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s can_spell = TRISTATE_TO_BOOL(decor_state.spell, can_spell); } - if (folded_attr) { - decor_attr = hl_combine_attr(folded_attr, decor_attr); - } - - if (decor_attr) { - if (!attr_pri) { - if (wlv.cul_attr) { - wlv.char_attr = 0 != wlv.line_attr_lowprio - ? hl_combine_attr(wlv.cul_attr, decor_attr) - : hl_combine_attr(decor_attr, wlv.cul_attr); - } else { - wlv.char_attr = decor_attr; - } - } else { - wlv.char_attr = hl_combine_attr(decor_attr, wlv.char_attr); - } - } else if (!attr_pri) { - wlv.char_attr = 0; - } + char_attr_base = hl_combine_attr(folded_attr, decor_attr); + wlv.char_attr = hl_combine_attr(char_attr_base, char_attr_pri); // Check spelling (unless at the end of the line). // Only do this when there is no syntax highlighting, the @@ -2083,11 +2062,8 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s } } if (spell_attr != 0) { - if (!attr_pri) { - wlv.char_attr = hl_combine_attr(wlv.char_attr, spell_attr); - } else { - wlv.char_attr = hl_combine_attr(spell_attr, wlv.char_attr); - } + char_attr_base = hl_combine_attr(char_attr_base, spell_attr); + wlv.char_attr = hl_combine_attr(char_attr_base, char_attr_pri); } if (wp->w_buffer->terminal) { diff --git a/test/functional/ui/decorations_spec.lua b/test/functional/ui/decorations_spec.lua index 042975f898..d96f614cd9 100644 --- a/test/functional/ui/decorations_spec.lua +++ b/test/functional/ui/decorations_spec.lua @@ -1964,7 +1964,7 @@ describe('extmark decorations', function() ]]} end) - pending('highlight applies to a full TAB in visual block mode', function() + it('highlight applies to a full TAB in visual block mode', function() screen:try_resize(50, 8) command('hi! Visual guifg=NONE guibg=LightGrey') api.nvim_buf_set_lines(0, 0, -1, true, {'asdf', '\tasdf', '\tasdf', '\tasdf', 'asdf'}) diff --git a/test/functional/ui/fold_spec.lua b/test/functional/ui/fold_spec.lua index 2712e5ff48..8f6e8aef7e 100644 --- a/test/functional/ui/fold_spec.lua +++ b/test/functional/ui/fold_spec.lua @@ -55,6 +55,8 @@ describe('folded lines', function() }, [19] = { background = Screen.colors.Yellow, foreground = Screen.colors.DarkBlue }, [20] = { background = Screen.colors.Red, bold = true, foreground = Screen.colors.Blue }, + [21] = { background = Screen.colors.LightGrey, foreground = Screen.colors.Green }, + [22] = { background = Screen.colors.Red, foreground = Screen.colors.Green }, }) end) @@ -2625,6 +2627,8 @@ describe('folded lines', function() command('hi! CursorLine guibg=NONE guifg=Red gui=NONE') command('hi F0 guibg=Red guifg=Black') command('hi F1 guifg=White') + command([[syn match Keyword /\<sentence\>/]]) + command('hi! Keyword guibg=NONE guifg=Green') api.nvim_set_option_value('cursorline', true, {}) api.nvim_set_option_value('foldcolumn', '4', {}) api.nvim_set_option_value('foldtext', '', {}) @@ -2662,7 +2666,7 @@ describe('folded lines', function() ## grid 2 {7: }This is a | {7:- }valid English | - {7:│+ }{5:sentence composed by······}| + {7:│+ }{21:sentence}{5: composed by······}| {7:│+ }{13:^in his cave.··············}| {1:~ }|*2 ## grid 3 @@ -2672,7 +2676,7 @@ describe('folded lines', function() screen:expect([[ {7: }This is a | {7:- }valid English | - {7:│+ }{5:sentence composed by······}| + {7:│+ }{21:sentence}{5: composed by······}| {7:│+ }{13:^in his cave.··············}| {1:~ }|*2 | @@ -2689,7 +2693,7 @@ describe('folded lines', function() ## grid 2 {7: }This is a | {7:- }^v{14:alid English} | - {7:│+ }{15:sentence composed by······}| + {7:│+ }{22:sentence}{15: composed by······}| {7:│+ }{15:in his cave.··············}| {1:~ }|*2 ## grid 3 @@ -2699,7 +2703,7 @@ describe('folded lines', function() screen:expect([[ {7: }This is a | {7:- }^v{14:alid English} | - {7:│+ }{15:sentence composed by······}| + {7:│+ }{22:sentence}{15: composed by······}| {7:│+ }{15:in his cave.··············}| {1:~ }|*2 {11:-- VISUAL LINE --} | @@ -2715,7 +2719,7 @@ describe('folded lines', function() ## grid 2 a si sihT{7: }| {14:hsilgnE dila}^v{7: -}| - {15:······yb desopmoc ecnetnes}{7: +│}| + {15:······yb desopmoc }{22:ecnetnes}{7: +│}| {15:··············.evac sih ni}{7: +│}| {1: ~}|*2 ## grid 3 @@ -2725,7 +2729,7 @@ describe('folded lines', function() screen:expect([[ a si sihT{7: }| {14:hsilgnE dila}^v{7: -}| - {15:······yb desopmoc ecnetnes}{7: +│}| + {15:······yb desopmoc }{22:ecnetnes}{7: +│}| {15:··············.evac sih ni}{7: +│}| {1: ~}|*2 {11:-- VISUAL LINE --} | diff --git a/test/functional/ui/spell_spec.lua b/test/functional/ui/spell_spec.lua index da112148cd..f0fa47ebfb 100644 --- a/test/functional/ui/spell_spec.lua +++ b/test/functional/ui/spell_spec.lua @@ -377,4 +377,35 @@ describe("'spell'", function() | ]]) end) + + it('overrides syntax when Visual selection is active', function() + screen:try_resize(43, 3) + screen:set_default_attr_ids({ + [0] = { bold = true, foreground = Screen.colors.Blue }, + [1] = { foreground = Screen.colors.Blue }, + [2] = { foreground = Screen.colors.Red }, + [3] = { foreground = Screen.colors.Blue, underline = true }, + [4] = { foreground = Screen.colors.Red, underline = true }, + [5] = { bold = true }, + }) + exec([[ + hi! Comment guibg=NONE guifg=Blue gui=NONE guisp=NONE + hi! SpellBad guibg=NONE guifg=Red gui=NONE guisp=NONE + hi! Visual guibg=NONE guifg=NONE gui=underline guisp=NONE + syn match Comment "//.*" + call setline(1, '// Here is a misspeld word.') + set spell + ]]) + screen:expect([[ + {1:^// Here is a }{2:misspeld}{1: word.} | + {0:~ }| + | + ]]) + feed('V') + screen:expect([[ + {1:^/}{3:/ Here is a }{4:misspeld}{3: word.} | + {0:~ }| + {5:-- VISUAL LINE --} | + ]]) + end) end) |