]> granicus.if.org Git - vim/commitdiff
patch 9.0.1048: with "screenline" in 'culopt' cursorline highlight is wrong v9.0.1048
authorzeertzjq <zeertzjq@outlook.com>
Mon, 12 Dec 2022 13:20:43 +0000 (13:20 +0000)
committerBram Moolenaar <Bram@vim.org>
Mon, 12 Dec 2022 13:20:43 +0000 (13:20 +0000)
Problem:    With "screenline" in 'culopt' cursorline highlight is wrong.
Solution:   Apply the priority logic also when "screenline is in 'culopt'.
            (closes #11696)

src/drawline.c
src/testdir/dumps/Test_quickfix_cwindow_3.dump
src/testdir/dumps/Test_quickfix_cwindow_4.dump
src/testdir/test_quickfix.vim
src/testdir/test_signs.vim
src/version.c

index 804b1005af94518e6150e38317ec76e453e3a864..0e090f42d137a49554cbf0648a63994e1bf44c01 100644 (file)
@@ -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
 
index 3fafbebebf2dc926aaec76d10f10660f5c1a22ca..d4a2e16929fa212998c74738e0d1c8664844f572 100644 (file)
@@ -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
index 9baaf5122a2f11d897ac1f614f351f09482eb021..bb92ffc0d499d7575abd105eefd786c92fc33e26 100644 (file)
@@ -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
index 1620db5281a44a6e927d498aa9c58b3299728e06..68170f888d1cc8e422819ef86186028ed33aedca 100644 (file)
@@ -3120,6 +3120,11 @@ func Test_cwindow_highlight()
   call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {})
 
   call term_sendkeys(buf, "\<C-W>j:set cursorline\<CR>")
+  call term_sendkeys(buf, ":\<CR>")
+  call VerifyScreenDump(buf, 'Test_quickfix_cwindow_3', {})
+
+  call term_sendkeys(buf, ":set cursorlineopt=number,screenline\<CR>")
+  call term_sendkeys(buf, ":\<CR>")
   call VerifyScreenDump(buf, 'Test_quickfix_cwindow_3', {})
 
   call term_sendkeys(buf, "j")
index abf70cd5200bae0e1b2af3f1e854d5fb876f3874..76cefa21c4eb979e7f6f744f0cc333b4c58b1d6f 100644 (file)
@@ -1805,12 +1805,18 @@ func Test_sign_cursor_position()
   call term_sendkeys(buf, "2G")
   call term_sendkeys(buf, ":\<CR>")
   call VerifyScreenDump(buf, 'Test_sign_cursor_5', {})
+  call term_sendkeys(buf, ":set cursorlineopt=number,screenline\<CR>")
+  call term_sendkeys(buf, ":\<CR>")
+  call VerifyScreenDump(buf, 'Test_sign_cursor_5', {})
 
   " sign highlighting overrules 'cursorline'
   call term_sendkeys(buf, ":sign unplace 12\<CR>")
   call term_sendkeys(buf, ":sign place 13 line=2 priority=100 name=s2\<CR>")
   call term_sendkeys(buf, ":\<CR>")
   call VerifyScreenDump(buf, 'Test_sign_cursor_6', {})
+  call term_sendkeys(buf, ":set cursorlineopt&\<CR>")
+  call term_sendkeys(buf, ":\<CR>")
+  call VerifyScreenDump(buf, 'Test_sign_cursor_6', {})
 
   " clean up
   call StopVimInTerminal(buf)
index f4e8d9f8519d3f88d31690c85f2c0a7c0f827557..ad9e52b2e42921a19efe4a09df51d1157bd76835 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1048,
 /**/
     1047,
 /**/