@@ -81,6 +81,8 @@ typedef struct {
8181 int cul_attr ; ///< set when 'cursorline' active
8282 int line_attr ; ///< attribute for the whole line
8383 int line_attr_lowprio ; ///< low-priority attribute for the line
84+ int sign_num_attr ; ///< line number attribute (sign numhl)
85+ int sign_cul_attr ; ///< cursorline sign attribute (sign culhl)
8486
8587 int fromcol ; ///< start of inverting
8688 int tocol ; ///< end of inverting
@@ -397,7 +399,7 @@ static void draw_col_fill(winlinevars_T *wlv, schar_T fillchar, int width, int a
397399}
398400
399401/// Return true if CursorLineSign highlight is to be used.
400- static bool use_cursor_line_highlight (win_T * wp , linenr_T lnum )
402+ bool use_cursor_line_highlight (win_T * wp , linenr_T lnum )
401403{
402404 return wp -> w_p_cul
403405 && lnum == wp -> w_cursorline
@@ -460,16 +462,15 @@ void fill_foldcolumn(win_T *wp, foldinfo_T foldinfo, linenr_T lnum, int attr, in
460462/// If "nrcol" is true, the sign is going to be displayed in the number column.
461463/// Otherwise the sign is going to be displayed in the sign column. If there is no
462464/// sign, draw blank cells instead.
463- static void draw_sign (bool nrcol , win_T * wp , winlinevars_T * wlv , int sign_idx , int sign_cul_attr )
465+ static void draw_sign (bool nrcol , win_T * wp , winlinevars_T * wlv , int sign_idx )
464466{
465467 SignTextAttrs sattr = wlv -> sattrs [sign_idx ];
466468 int scl_attr = win_hl_attr (wp , use_cursor_line_highlight (wp , wlv -> lnum ) ? HLF_CLS : HLF_SC );
467469
468470 if (sattr .text [0 ] && wlv -> row == wlv -> startrow + wlv -> filler_lines && wlv -> filler_todo <= 0 ) {
469- int attr = (use_cursor_line_highlight (wp , wlv -> lnum ) && sign_cul_attr )
470- ? sign_cul_attr : sattr .hl_id ? syn_id2attr (sattr .hl_id ) : 0 ;
471- attr = hl_combine_attr (scl_attr , attr );
472471 int fill = nrcol ? number_width (wp ) + 1 : SIGN_WIDTH ;
472+ int attr = wlv -> sign_cul_attr ? wlv -> sign_cul_attr : sattr .hl_id ? syn_id2attr (sattr .hl_id ) : 0 ;
473+ attr = hl_combine_attr (scl_attr , attr );
473474 draw_col_fill (wlv , schar_from_ascii (' ' ), fill , attr );
474475 int sign_pos = wlv -> off - SIGN_WIDTH - (int )nrcol ;
475476 assert (sign_pos >= 0 );
@@ -544,7 +545,7 @@ static int get_line_number_attr(win_T *wp, winlinevars_T *wlv)
544545
545546/// Display the absolute or relative line number. After the first row fill with
546547/// blanks when the 'n' flag isn't in 'cpo'.
547- static void draw_lnum_col (win_T * wp , winlinevars_T * wlv , int sign_num_attr , int sign_cul_attr )
548+ static void draw_lnum_col (win_T * wp , winlinevars_T * wlv )
548549{
549550 bool has_cpo_n = vim_strchr (p_cpo , CPO_NUMCOL ) != NULL ;
550551
@@ -557,12 +558,12 @@ static void draw_lnum_col(win_T *wp, winlinevars_T *wlv, int sign_num_attr, int
557558 // then display the sign instead of the line number.
558559 if (wp -> w_minscwidth == SCL_NUM && wlv -> sattrs [0 ].text [0 ]
559560 && wlv -> row == wlv -> startrow + wlv -> filler_lines && wlv -> filler_todo <= 0 ) {
560- draw_sign (true, wp , wlv , 0 , sign_cul_attr );
561+ draw_sign (true, wp , wlv , 0 );
561562 } else {
562563 // Draw the line number (empty space after wrapping).
563564 int width = number_width (wp ) + 1 ;
564565 int attr = hl_combine_attr (get_line_number_attr (wp , wlv ),
565- wlv -> filler_todo <= 0 ? sign_num_attr : 0 );
566+ wlv -> filler_todo <= 0 ? wlv -> sign_num_attr : 0 );
566567 if (wlv -> row == wlv -> startrow + wlv -> filler_lines
567568 && (wp -> w_skipcol == 0 || wlv -> row > 0 || (wp -> w_p_nu && wp -> w_p_rnu ))) {
568569 char buf [32 ];
@@ -631,22 +632,25 @@ static void draw_statuscol(win_T *wp, winlinevars_T *wlv, linenr_T lnum, int vir
631632
632633 char * p = buf ;
633634 char transbuf [MAXPATHL ];
634- int attr = stcp -> num_attr ;
635635 size_t len = strlen (buf );
636+ int scl_attr = win_hl_attr (wp , use_cursor_line_highlight (wp , wlv -> lnum ) ? HLF_CLS : HLF_SC );
637+ int num_attr = hl_combine_attr (get_line_number_attr (wp , wlv ),
638+ wlv -> filler_todo <= 0 ? wlv -> sign_num_attr : 0 );
639+ int cur_attr = num_attr ;
636640
637641 // Draw each segment with the specified highlighting.
638642 for (stl_hlrec_t * sp = stcp -> hlrec ; sp -> start != NULL ; sp ++ ) {
639643 ptrdiff_t textlen = sp -> start - p ;
640644 // Make all characters printable.
641645 size_t translen = transstr_buf (p , textlen , transbuf , MAXPATHL , true);
642- draw_col_buf (wp , wlv , transbuf , translen , attr , false);
646+ draw_col_buf (wp , wlv , transbuf , translen , cur_attr , false);
647+ int attr = sp -> item == STL_SIGNCOL ? scl_attr : sp -> item == STL_FOLDCOL ? 0 : num_attr ;
648+ cur_attr = hl_combine_attr (attr , sp -> userhl < 0 ? syn_id2attr (- sp -> userhl ) : 0 );
643649 p = sp -> start ;
644- int hl = sp -> userhl ;
645- attr = hl < 0 ? hl_combine_attr (stcp -> num_attr , syn_id2attr (- hl )) : stcp -> num_attr ;
646650 }
647651 size_t translen = transstr_buf (p , buf + len - p , transbuf , MAXPATHL , true);
648- draw_col_buf (wp , wlv , transbuf , translen , attr , false);
649- draw_col_fill (wlv , schar_from_ascii (' ' ), stcp -> width - width , stcp -> num_attr );
652+ draw_col_buf (wp , wlv , transbuf , translen , num_attr , false);
653+ draw_col_fill (wlv , schar_from_ascii (' ' ), stcp -> width - width , num_attr );
650654}
651655
652656static void handle_breakindent (win_T * wp , winlinevars_T * wlv )
@@ -1201,11 +1205,10 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
12011205 area_highlighting = true;
12021206 }
12031207
1204- int line_attr = 0 ;
1205- int sign_cul_attr = 0 ;
1206- int sign_num_attr = 0 ;
1208+ int sign_line_attr = 0 ;
12071209 // TODO(bfredl, vigoux): line_attr should not take priority over decoration!
1208- decor_redraw_signs (wp , buf , wlv .lnum - 1 , wlv .sattrs , & line_attr , & sign_cul_attr , & sign_num_attr );
1210+ decor_redraw_signs (wp , buf , wlv .lnum - 1 , wlv .sattrs ,
1211+ & sign_line_attr , & wlv .sign_cul_attr , & wlv .sign_num_attr );
12091212
12101213 statuscol_T statuscol = { 0 };
12111214 if (* wp -> w_p_stc != NUL ) {
@@ -1214,19 +1217,15 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
12141217 statuscol .sattrs = wlv .sattrs ;
12151218 statuscol .foldinfo = foldinfo ;
12161219 statuscol .width = win_col_off (wp ) - (wp == cmdwin_win );
1217- statuscol .use_cul = use_cursor_line_highlight (wp , lnum );
1218- statuscol .sign_cul_id = statuscol .use_cul ? sign_cul_attr : 0 ;
1219- statuscol .num_attr = sign_num_attr > 0 ? syn_id2attr (sign_num_attr ) : 0 ;
1220- } else {
1221- if (sign_cul_attr > 0 ) {
1222- sign_cul_attr = syn_id2attr (sign_cul_attr );
1223- }
1224- if (sign_num_attr > 0 ) {
1225- sign_num_attr = syn_id2attr (sign_num_attr );
1226- }
1220+ statuscol .sign_cul_id = use_cursor_line_highlight (wp , lnum ) ? wlv .sign_cul_attr : 0 ;
1221+ } else if (wlv .sign_cul_attr > 0 ) {
1222+ wlv .sign_cul_attr = use_cursor_line_highlight (wp , lnum ) ? syn_id2attr (wlv .sign_cul_attr ) : 0 ;
12271223 }
1228- if (line_attr > 0 ) {
1229- wlv .line_attr = syn_id2attr (line_attr );
1224+ if (wlv .sign_num_attr > 0 ) {
1225+ wlv .sign_num_attr = syn_id2attr (wlv .sign_num_attr );
1226+ }
1227+ if (sign_line_attr > 0 ) {
1228+ wlv .line_attr = syn_id2attr (sign_line_attr );
12301229 }
12311230
12321231 // Highlight the current line in the quickfix window.
@@ -1549,9 +1548,6 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
15491548 // skip columns
15501549 } else if (statuscol .draw ) {
15511550 // Draw 'statuscolumn' if it is set.
1552- if (sign_num_attr == 0 ) {
1553- statuscol .num_attr = get_line_number_attr (wp , & wlv );
1554- }
15551551 const int v = (int )(ptr - line );
15561552 draw_statuscol (wp , & wlv , lnum , wlv .row - startrow - wlv .filler_lines , col_rows , & statuscol );
15571553 if (wp -> w_redr_statuscol ) {
@@ -1568,10 +1564,10 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
15681564
15691565 // wp->w_scwidth is zero if signcol=number is used
15701566 for (int sign_idx = 0 ; sign_idx < wp -> w_scwidth ; sign_idx ++ ) {
1571- draw_sign (false, wp , & wlv , sign_idx , sign_cul_attr );
1567+ draw_sign (false, wp , & wlv , sign_idx );
15721568 }
15731569
1574- draw_lnum_col (wp , & wlv , sign_num_attr , sign_cul_attr );
1570+ draw_lnum_col (wp , & wlv );
15751571 }
15761572
15771573 win_col_offset = wlv .off ;
0 commit comments