# HG changeset patch # User Bram Moolenaar # Date 1670851805 -3600 # Node ID 552ca9b4218dc4c0b34af51acffe32a0b0932564 # Parent e5e95e8c78a736397a275e5f27ed3beeff0460ff patch 9.0.1048: with "screenline" in 'culopt' cursorline highlight is wrong Commit: https://github.com/vim/vim/commit/b7acea1806996a9afb9fb8ebfe571b5181063070 Author: zeertzjq Date: Mon Dec 12 13:20:43 2022 +0000 patch 9.0.1048: with "screenline" in 'culopt' cursorline highlight is wrong Problem: With "screenline" in 'culopt' cursorline highlight is wrong. Solution: Apply the priority logic also when "screenline is in 'culopt'. (closes #11696) diff --git a/src/drawline.c b/src/drawline.c --- a/src/drawline.c +++ b/src/drawline.c @@ -985,6 +985,36 @@ win_line_continue(winlinevars_T *wlv) wlv->char_attr = wlv->win_attr; } +#ifdef FEAT_SYN_HL + static void +apply_cursorline_highlight( + winlinevars_T *wlv, + int sign_present UNUSED) +{ + wlv->cul_attr = HL_ATTR(HLF_CUL); +# ifdef FEAT_SIGNS + // Combine the 'cursorline' and sign highlighting, depending on + // the sign priority. + if (sign_present && wlv->sattr.sat_linehl > 0) + { + if (wlv->sattr.sat_priority >= 100) + wlv->line_attr = hl_combine_attr(wlv->cul_attr, wlv->line_attr); + else + wlv->line_attr = hl_combine_attr(wlv->line_attr, wlv->cul_attr); + } + else +# endif +# if defined(FEAT_QUICKFIX) + // let the line attribute overrule 'cursorline', otherwise + // it disappears when both have background set; + // 'cursorline' can use underline or bold to make it show + wlv->line_attr = hl_combine_attr(wlv->cul_attr, wlv->line_attr); +# else + wlv->line_attr = wlv->cul_attr; +# endif +} +#endif + /* * Display line "lnum" of window 'wp' on the screen. * Start at row "startrow", stop when "endrow" is reached. @@ -1728,35 +1758,10 @@ win_line( wlv.cul_screenline = (wp->w_p_wrap && (wp->w_p_culopt_flags & CULOPT_SCRLINE)); - // Only set wlv.line_attr here when "screenline" is not present in - // 'cursorlineopt'. Otherwise it's done later. + // Only apply CursorLine highlight here when "screenline" is not + // present in 'cursorlineopt'. Otherwise it's done later. if (!wlv.cul_screenline) - { - wlv.cul_attr = HL_ATTR(HLF_CUL); -# ifdef FEAT_SIGNS - // Combine the 'cursorline' and sign highlighting, depending on - // the sign priority. - if (sign_present && wlv.sattr.sat_linehl > 0) - { - if (wlv.sattr.sat_priority >= 100) - wlv.line_attr = hl_combine_attr( - wlv.cul_attr, wlv.line_attr); - else - wlv.line_attr = hl_combine_attr( - wlv.line_attr, wlv.cul_attr); - } - else -# endif -# if defined(FEAT_QUICKFIX) - // let the line attribute overrule 'cursorline', otherwise - // it disappears when both have background set; - // 'cursorline' can use underline or bold to make it show - wlv.line_attr = hl_combine_attr( - wlv.cul_attr, wlv.line_attr); -# else - wlv.line_attr = wlv.cul_attr; -# endif - } + apply_cursorline_highlight(&wlv, sign_present); else { line_attr_save = wlv.line_attr; @@ -1850,8 +1855,7 @@ win_line( && wlv.vcol >= left_curline_col && wlv.vcol < right_curline_col) { - wlv.cul_attr = HL_ATTR(HLF_CUL); - wlv.line_attr = wlv.cul_attr; + apply_cursorline_highlight(&wlv, sign_present); } #endif diff --git a/src/testdir/dumps/Test_quickfix_cwindow_3.dump b/src/testdir/dumps/Test_quickfix_cwindow_3.dump --- a/src/testdir/dumps/Test_quickfix_cwindow_3.dump +++ b/src/testdir/dumps/Test_quickfix_cwindow_3.dump @@ -9,4 +9,4 @@ |X+0#0000e05#ffffff0|C|w|i|n|d|o|w||+0#0000000&|4+0#af5f00255&| |c|o|l| |6|-|7||+0#0000000&| |m|a|t|c|h|e|s| @47 |~+0#4040ff13&| @73 |[+3#0000000&|Q|u|i|c|k|f|i|x| |L|i|s|t|]| |:|v|i|m|g|r|e|p| |e| |X|C|w|i|n|d|o|w| @20|2|,|1| @12|A|l@1 -|:+0&&|s|e|t| |c|u|r|s|o|r|l|i|n|e| @59 +|:+0&&| @73 diff --git a/src/testdir/dumps/Test_quickfix_cwindow_4.dump b/src/testdir/dumps/Test_quickfix_cwindow_4.dump --- a/src/testdir/dumps/Test_quickfix_cwindow_4.dump +++ b/src/testdir/dumps/Test_quickfix_cwindow_4.dump @@ -9,4 +9,4 @@ >X+8#0000e05#ffffff0|C|w|i|n|d|o|w||+8#0000000&|4+8#af5f00255&| |c|o|l| |6|-|7||+8#0000000&| |m|a|t|c|h|e|s| @47 |~+0#4040ff13&| @73 |[+3#0000000&|Q|u|i|c|k|f|i|x| |L|i|s|t|]| |:|v|i|m|g|r|e|p| |e| |X|C|w|i|n|d|o|w| @20|3|,|1| @12|A|l@1 -|:+0&&|s|e|t| |c|u|r|s|o|r|l|i|n|e| @59 +|:+0&&| @73 diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim --- a/src/testdir/test_quickfix.vim +++ b/src/testdir/test_quickfix.vim @@ -3120,6 +3120,11 @@ func Test_cwindow_highlight() call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {}) call term_sendkeys(buf, "\j:set cursorline\") + call term_sendkeys(buf, ":\") + call VerifyScreenDump(buf, 'Test_quickfix_cwindow_3', {}) + + call term_sendkeys(buf, ":set cursorlineopt=number,screenline\") + call term_sendkeys(buf, ":\") call VerifyScreenDump(buf, 'Test_quickfix_cwindow_3', {}) call term_sendkeys(buf, "j") diff --git a/src/testdir/test_signs.vim b/src/testdir/test_signs.vim --- a/src/testdir/test_signs.vim +++ b/src/testdir/test_signs.vim @@ -1805,12 +1805,18 @@ func Test_sign_cursor_position() call term_sendkeys(buf, "2G") call term_sendkeys(buf, ":\") call VerifyScreenDump(buf, 'Test_sign_cursor_5', {}) + call term_sendkeys(buf, ":set cursorlineopt=number,screenline\") + call term_sendkeys(buf, ":\") + call VerifyScreenDump(buf, 'Test_sign_cursor_5', {}) " sign highlighting overrules 'cursorline' call term_sendkeys(buf, ":sign unplace 12\") call term_sendkeys(buf, ":sign place 13 line=2 priority=100 name=s2\") call term_sendkeys(buf, ":\") call VerifyScreenDump(buf, 'Test_sign_cursor_6', {}) + call term_sendkeys(buf, ":set cursorlineopt&\") + call term_sendkeys(buf, ":\") + call VerifyScreenDump(buf, 'Test_sign_cursor_6', {}) " clean up call StopVimInTerminal(buf) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1048, +/**/ 1047, /**/ 1046,