Patch 9.0.0519
Problem:    The win_line() function is much too long.
Solution:   Move the code to draw the line number to a separate function.
Files:      src/drawline.c


*** ../vim-9.0.0518/src/drawline.c      2022-09-20 17:57:31.826990773 +0100
--- src/drawline.c      2022-09-20 18:56:52.670059720 +0100
***************
*** 102,107 ****
--- 102,108 ----
  
      int               win_attr;       // background for the whole window, 
except
                                // margins and "~" lines.
+     int               wcr_attr;       // attributes from 'wincolor'
  
      int               screen_line_flags;  // flags for screen_line()
  
***************
*** 123,131 ****
--- 124,139 ----
      int               saved_c_final;
      int               saved_char_attr;
  
+     char_u    extra[21];              // "%ld " and 'fdc' must fit in here
+ 
  #ifdef FEAT_DIFF
      hlf_T     diff_hlf;       // type of diff highlighting
  #endif
+     int               filler_lines;   // nr of filler lines to be drawn
+     int               filler_todo;    // nr of filler lines still to do + 1
+ #ifdef FEAT_SIGNS
+     sign_attrs_T sattr;
+ #endif
  } winlinevars_T;
  
  // draw_state values for items that are drawn in sequence:
***************
*** 171,191 ****
  }
  
  /*
!  * Get information needed to display the sign in line 'lnum' in window 'wp'.
!  * If 'nrcol' is TRUE, the sign is going to be displayed in the number column.
   * Otherwise the sign is going to be displayed in the sign column.
   */
      static void
  get_sign_display_info(
        int             nrcol,
        win_T           *wp,
!       linenr_T        lnum,
!       winlinevars_T   *wlv,
!       sign_attrs_T    *sattr,
!       int             wcr_attr,
!       int             filler_lines UNUSED,
!       int             filler_todo UNUSED,
!       char_u          *extra)
  {
      int       text_sign;
  # ifdef FEAT_SIGN_ICONS
--- 179,194 ----
  }
  
  /*
!  * Get information needed to display the sign in line "wlv->lnum" in window
!  * "wp".
!  * If "nrcol" is TRUE, the sign is going to be displayed in the number column.
   * Otherwise the sign is going to be displayed in the sign column.
   */
      static void
  get_sign_display_info(
        int             nrcol,
        win_T           *wp,
!       winlinevars_T   *wlv)
  {
      int       text_sign;
  # ifdef FEAT_SIGN_ICONS
***************
*** 199,241 ****
        wlv->n_extra = number_width(wp) + 1;
      else
      {
!       if (use_cursor_line_sign(wp, lnum))
!           wlv->char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_CLS));
        else
!           wlv->char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_SC));
        wlv->n_extra = 2;
      }
  
      if (wlv->row == wlv->startrow
  #ifdef FEAT_DIFF
!           + filler_lines && filler_todo <= 0
  #endif
         )
      {
!       text_sign = (sattr->sat_text != NULL) ? sattr->sat_typenr : 0;
  # ifdef FEAT_SIGN_ICONS
!       icon_sign = (sattr->sat_icon != NULL) ? sattr->sat_typenr : 0;
        if (gui.in_use && icon_sign != 0)
        {
            // Use the image in this position.
            if (nrcol)
            {
                wlv->c_extra = NUL;
!               sprintf((char *)extra, "%-*c ", number_width(wp), SIGN_BYTE);
!               wlv->p_extra = extra;
                wlv->n_extra = (int)STRLEN(wlv->p_extra);
            }
            else
                wlv->c_extra = SIGN_BYTE;
  #  ifdef FEAT_NETBEANS_INTG
!           if (netbeans_active() && (buf_signcount(wp->w_buffer, lnum) > 1))
            {
                if (nrcol)
                {
                    wlv->c_extra = NUL;
!                   sprintf((char *)extra, "%-*c ", number_width(wp),
                                                        MULTISIGN_BYTE);
!                   wlv->p_extra = extra;
                    wlv->n_extra = (int)STRLEN(wlv->p_extra);
                }
                else
--- 202,246 ----
        wlv->n_extra = number_width(wp) + 1;
      else
      {
!       if (use_cursor_line_sign(wp, wlv->lnum))
!           wlv->char_attr = hl_combine_attr(wlv->wcr_attr, HL_ATTR(HLF_CLS));
        else
!           wlv->char_attr = hl_combine_attr(wlv->wcr_attr, HL_ATTR(HLF_SC));
        wlv->n_extra = 2;
      }
  
      if (wlv->row == wlv->startrow
  #ifdef FEAT_DIFF
!           + wlv->filler_lines && wlv->filler_todo <= 0
  #endif
         )
      {
!       text_sign = (wlv->sattr.sat_text != NULL) ? wlv->sattr.sat_typenr : 0;
  # ifdef FEAT_SIGN_ICONS
!       icon_sign = (wlv->sattr.sat_icon != NULL) ? wlv->sattr.sat_typenr : 0;
        if (gui.in_use && icon_sign != 0)
        {
            // Use the image in this position.
            if (nrcol)
            {
                wlv->c_extra = NUL;
!               sprintf((char *)wlv->extra, "%-*c ",
!                                                 number_width(wp), SIGN_BYTE);
!               wlv->p_extra = wlv->extra;
                wlv->n_extra = (int)STRLEN(wlv->p_extra);
            }
            else
                wlv->c_extra = SIGN_BYTE;
  #  ifdef FEAT_NETBEANS_INTG
!           if (netbeans_active() && (buf_signcount(wp->w_buffer, wlv->lnum)
!                                                                         > 1))
            {
                if (nrcol)
                {
                    wlv->c_extra = NUL;
!                   sprintf((char *)wlv->extra, "%-*c ", number_width(wp),
                                                        MULTISIGN_BYTE);
!                   wlv->p_extra = wlv->extra;
                    wlv->n_extra = (int)STRLEN(wlv->p_extra);
                }
                else
***************
*** 249,255 ****
  # endif
            if (text_sign != 0)
            {
!               wlv->p_extra = sattr->sat_text;
                if (wlv->p_extra != NULL)
                {
                    if (nrcol)
--- 254,260 ----
  # endif
            if (text_sign != 0)
            {
!               wlv->p_extra = wlv->sattr.sat_text;
                if (wlv->p_extra != NULL)
                {
                    if (nrcol)
***************
*** 257,282 ****
                        int n, width = number_width(wp) - 2;
  
                        for (n = 0; n < width; n++)
!                           extra[n] = ' ';
!                       extra[n] = 0;
!                       STRCAT(extra, wlv->p_extra);
!                       STRCAT(extra, " ");
!                       wlv->p_extra = extra;
                    }
                    wlv->c_extra = NUL;
                    wlv->c_final = NUL;
                    wlv->n_extra = (int)STRLEN(wlv->p_extra);
                }
  
!               if (use_cursor_line_sign(wp, lnum) && sattr->sat_culhl > 0)
!                   wlv->char_attr = sattr->sat_culhl;
                else
!                   wlv->char_attr = sattr->sat_texthl;
            }
      }
  }
  #endif
  
  #if defined(FEAT_PROP_POPUP) || defined(PROTO)
  /*
   * Return the cell size of virtual text after truncation.
--- 262,396 ----
                        int n, width = number_width(wp) - 2;
  
                        for (n = 0; n < width; n++)
!                           wlv->extra[n] = ' ';
!                       wlv->extra[n] = 0;
!                       STRCAT(wlv->extra, wlv->p_extra);
!                       STRCAT(wlv->extra, " ");
!                       wlv->p_extra = wlv->extra;
                    }
                    wlv->c_extra = NUL;
                    wlv->c_final = NUL;
                    wlv->n_extra = (int)STRLEN(wlv->p_extra);
                }
  
!               if (use_cursor_line_sign(wp, wlv->lnum)
!                                                 && wlv->sattr.sat_culhl > 0)
!                   wlv->char_attr = wlv->sattr.sat_culhl;
                else
!                   wlv->char_attr = wlv->sattr.sat_texthl;
            }
      }
  }
  #endif
  
+ /*
+  * Display the absolute or relative line number.  After the first row fill 
with
+  * blanks when the 'n' flag isn't in 'cpo'.
+  */
+     static void
+ handle_lnum_col(
+       win_T           *wp,
+       winlinevars_T   *wlv,
+       int             sign_present UNUSED,
+       int             num_attr)
+ {
+     if ((wp->w_p_nu || wp->w_p_rnu)
+           && (wlv->row == wlv->startrow + wlv->filler_lines
+                        || vim_strchr(p_cpo, CPO_NUMCOL) == NULL))
+     {
+ #ifdef FEAT_SIGNS
+       // If 'signcolumn' is set to 'number' and a sign is present
+       // in 'lnum', then display the sign instead of the line
+       // number.
+       if ((*wp->w_p_scl == 'n' && *(wp->w_p_scl + 1) == 'u') && sign_present)
+           get_sign_display_info(TRUE, wp, wlv);
+       else
+ #endif
+       {
+         // Draw the line number (empty space after wrapping).
+         if (wlv->row == wlv->startrow + wlv->filler_lines)
+         {
+           long num;
+           char *fmt = "%*ld ";
+ 
+           if (wp->w_p_nu && !wp->w_p_rnu)
+               // 'number' + 'norelativenumber'
+               num = (long)wlv->lnum;
+           else
+           {
+               // 'relativenumber', don't use negative numbers
+               num = labs((long)get_cursor_rel_lnum(wp, wlv->lnum));
+               if (num == 0 && wp->w_p_nu && wp->w_p_rnu)
+               {
+                   // 'number' + 'relativenumber'
+                   num = wlv->lnum;
+                   fmt = "%-*ld ";
+               }
+           }
+ 
+           sprintf((char *)wlv->extra, fmt, number_width(wp), num);
+           if (wp->w_skipcol > 0)
+               for (wlv->p_extra = wlv->extra; *wlv->p_extra == ' ';
+                                                               ++wlv->p_extra)
+                   *wlv->p_extra = '-';
+ #ifdef FEAT_RIGHTLEFT
+           if (wp->w_p_rl)                 // reverse line numbers
+           {
+               char_u  *p1, *p2;
+               int     t;
+ 
+               // like rl_mirror(), but keep the space at the end
+               p2 = skipwhite(wlv->extra);
+               p2 = skiptowhite(p2) - 1;
+               for (p1 = skipwhite(wlv->extra); p1 < p2; ++p1, --p2)
+               {
+                   t = *p1;
+                   *p1 = *p2;
+                   *p2 = t;
+               }
+           }
+ #endif
+           wlv->p_extra = wlv->extra;
+           wlv->c_extra = NUL;
+           wlv->c_final = NUL;
+         }
+         else
+         {
+           wlv->c_extra = ' ';
+           wlv->c_final = NUL;
+         }
+         wlv->n_extra = number_width(wp) + 1;
+         wlv->char_attr = hl_combine_attr(wlv->wcr_attr, HL_ATTR(HLF_N));
+ #ifdef FEAT_SYN_HL
+         // When 'cursorline' is set highlight the line number of
+         // the current line differently.
+         // When 'cursorlineopt' does not have "line" only
+         // highlight the line number itself.
+         // TODO: Can we use CursorLine instead of CursorLineNr
+         // when CursorLineNr isn't set?
+         if (wp->w_p_cul
+                 && wlv->lnum == wp->w_cursor.lnum
+                 && (wp->w_p_culopt_flags & CULOPT_NBR)
+                 && (wlv->row == wlv->startrow + wlv->filler_lines
+                     || (wlv->row > wlv->startrow + wlv->filler_lines
+                        && (wp->w_p_culopt_flags & CULOPT_LINE))))
+           wlv->char_attr = hl_combine_attr(wlv->wcr_attr, HL_ATTR(HLF_CLN));
+ #endif
+         if (wp->w_p_rnu && wlv->lnum < wp->w_cursor.lnum
+                                                     && HL_ATTR(HLF_LNA) != 0)
+             // Use LineNrAbove
+             wlv->char_attr = hl_combine_attr(wlv->wcr_attr, HL_ATTR(HLF_LNA));
+         if (wp->w_p_rnu && wlv->lnum > wp->w_cursor.lnum
+                                                     && HL_ATTR(HLF_LNB) != 0)
+             // Use LineNrBelow
+             wlv->char_attr = hl_combine_attr(wlv->wcr_attr, HL_ATTR(HLF_LNB));
+       }
+ #ifdef FEAT_SIGNS
+       if (num_attr)
+           wlv->char_attr = num_attr;
+ #endif
+     }
+ }
  #if defined(FEAT_PROP_POPUP) || defined(PROTO)
  /*
   * Return the cell size of virtual text after truncation.
***************
*** 613,619 ****
      char_u    *line;                  // current line
      char_u    *ptr;                   // current position in "line"
  
-     char_u    extra[21];              // "%ld " and 'fdc' must fit in here
      char_u    *p_extra_free = NULL;   // p_extra needs to be freed
  #ifdef FEAT_PROP_POPUP
      char_u    *p_extra_free2 = NULL;   // another p_extra to be freed
--- 727,732 ----
***************
*** 649,655 ****
                                           // in this line
      int               vi_attr = 0;            // attributes for Visual and 
incsearch
                                        // highlighting
-     int               wcr_attr = 0;           // attributes from 'wincolor'
      int               area_attr = 0;          // attributes desired by 
highlighting
      int               search_attr = 0;        // attributes desired by 
'hlsearch'
  #ifdef FEAT_SYN_HL
--- 762,767 ----
***************
*** 702,713 ****
      int               mb_c = 0;               // decoded multi-byte character
      int               mb_utf8 = FALSE;        // screen char is UTF-8 char
      int               u8cc[MAX_MCO];          // composing UTF-8 chars
- #if defined(FEAT_DIFF) || defined(FEAT_SIGNS)
-     int               filler_lines = 0;       // nr of filler lines to be 
drawn
-     int               filler_todo = 0;        // nr of filler lines still to 
do + 1
- #else
- # define filler_lines 0
- #endif
  #ifdef FEAT_DIFF
      int               change_start = MAXCOL;  // first col of changed area
      int               change_end = -1;        // last col of changed area
--- 814,819 ----
***************
*** 729,735 ****
  #endif
  #ifdef FEAT_SIGNS
      int               sign_present = FALSE;
-     sign_attrs_T sattr;
      int               num_attr = 0;           // attribute for the number 
column
  #endif
  #ifdef FEAT_ARABIC
--- 835,840 ----
***************
*** 996,1005 ****
      }
  
  #ifdef FEAT_DIFF
!     filler_lines = diff_check(wp, lnum);
!     if (filler_lines < 0)
      {
!       if (filler_lines == -1)
        {
            if (diff_find_change(wp, lnum, &change_start, &change_end))
                wlv.diff_hlf = HLF_ADD; // added line
--- 1101,1110 ----
      }
  
  #ifdef FEAT_DIFF
!     wlv.filler_lines = diff_check(wp, lnum);
!     if (wlv.filler_lines < 0)
      {
!       if (wlv.filler_lines == -1)
        {
            if (diff_find_change(wp, lnum, &change_start, &change_end))
                wlv.diff_hlf = HLF_ADD; // added line
***************
*** 1010,1034 ****
        }
        else
            wlv.diff_hlf = HLF_ADD;             // added line
!       filler_lines = 0;
        area_highlighting = TRUE;
      }
      if (lnum == wp->w_topline)
!       filler_lines = wp->w_topfill;
!     filler_todo = filler_lines;
  #endif
  
  #ifdef FEAT_SIGNS
!     sign_present = buf_get_signattrs(wp, lnum, &sattr);
      if (sign_present)
!       num_attr = sattr.sat_numhl;
  #endif
  
  #ifdef LINE_ATTR
  # ifdef FEAT_SIGNS
      // If this line has a sign with line highlighting set line_attr.
      if (sign_present)
!       line_attr = sattr.sat_linehl;
  # endif
  # if defined(FEAT_QUICKFIX)
      // Highlight the current line in the quickfix window.
--- 1115,1139 ----
        }
        else
            wlv.diff_hlf = HLF_ADD;             // added line
!       wlv.filler_lines = 0;
        area_highlighting = TRUE;
      }
      if (lnum == wp->w_topline)
!       wlv.filler_lines = wp->w_topfill;
!     wlv.filler_todo = wlv.filler_lines;
  #endif
  
  #ifdef FEAT_SIGNS
!     sign_present = buf_get_signattrs(wp, lnum, &wlv.sattr);
      if (sign_present)
!       num_attr = wlv.sattr.sat_numhl;
  #endif
  
  #ifdef LINE_ATTR
  # ifdef FEAT_SIGNS
      // If this line has a sign with line highlighting set line_attr.
      if (sign_present)
!       line_attr = wlv.sattr.sat_linehl;
  # endif
  # if defined(FEAT_QUICKFIX)
      // Highlight the current line in the quickfix window.
***************
*** 1114,1123 ****
        }
      }
  
!     wcr_attr = get_wcr_attr(wp);
!     if (wcr_attr != 0)
      {
!       wlv.win_attr = wcr_attr;
        area_highlighting = TRUE;
      }
  
--- 1219,1228 ----
        }
      }
  
!     wlv.wcr_attr = get_wcr_attr(wp);
!     if (wlv.wcr_attr != 0)
      {
!       wlv.win_attr = wlv.wcr_attr;
        area_highlighting = TRUE;
      }
  
***************
*** 1286,1294 ****
  # ifdef FEAT_SIGNS
                // Combine the 'cursorline' and sign highlighting, depending on
                // the sign priority.
!               if (sign_present && sattr.sat_linehl > 0)
                {
!                   if (sattr.sat_priority >= 100)
                        line_attr = hl_combine_attr(cul_attr, line_attr);
                    else
                        line_attr = hl_combine_attr(line_attr, cul_attr);
--- 1391,1399 ----
  # 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)
                        line_attr = hl_combine_attr(cul_attr, line_attr);
                    else
                        line_attr = hl_combine_attr(line_attr, cul_attr);
***************
*** 1374,1380 ****
                    wlv.n_extra = 1;
                    wlv.c_extra = cmdwin_type;
                    wlv.c_final = NUL;
!                   wlv.char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_AT));
                }
            }
  #endif
--- 1479,1486 ----
                    wlv.n_extra = 1;
                    wlv.c_extra = cmdwin_type;
                    wlv.c_final = NUL;
!                   wlv.char_attr =
!                               hl_combine_attr(wlv.wcr_attr, HL_ATTR(HLF_AT));
                }
            }
  #endif
***************
*** 1387,1394 ****
                wlv.draw_state = WL_FOLD;
                if (fdc > 0)
                {
!                   // Draw the 'foldcolumn'.  Allocate a buffer, "extra" may
!                   // already be in use.
                    vim_free(p_extra_free);
                    p_extra_free = alloc(MAX_MCO * fdc + 1);
                    if (p_extra_free != NULL)
--- 1493,1500 ----
                wlv.draw_state = WL_FOLD;
                if (fdc > 0)
                {
!                   // Draw the 'foldcolumn'.  Allocate a buffer, "wlv.extra"
!                   // may already be in use.
                    vim_free(p_extra_free);
                    p_extra_free = alloc(MAX_MCO * fdc + 1);
                    if (p_extra_free != NULL)
***************
*** 1401,1410 ****
                        wlv.c_final = NUL;
                        if (use_cursor_line_sign(wp, lnum))
                            wlv.char_attr =
!                                  hl_combine_attr(wcr_attr, HL_ATTR(HLF_CLF));
                        else
                            wlv.char_attr =
!                                   hl_combine_attr(wcr_attr, HL_ATTR(HLF_FC));
                    }
                }
            }
--- 1507,1516 ----
                        wlv.c_final = NUL;
                        if (use_cursor_line_sign(wp, lnum))
                            wlv.char_attr =
!                              hl_combine_attr(wlv.wcr_attr, HL_ATTR(HLF_CLF));
                        else
                            wlv.char_attr =
!                               hl_combine_attr(wlv.wcr_attr, HL_ATTR(HLF_FC));
                    }
                }
            }
***************
*** 1413,1534 ****
  #ifdef FEAT_SIGNS
            if (wlv.draw_state == WL_SIGN - 1 && wlv.n_extra == 0)
            {
                wlv.draw_state = WL_SIGN;
-               // Show the sign column when there are any signs in this
-               // buffer or when using Netbeans.
                if (signcolumn_on(wp))
!                   get_sign_display_info(FALSE, wp, lnum, &wlv, &sattr,
!                                  wcr_attr, filler_lines, filler_todo, extra);
            }
  #endif
  
            if (wlv.draw_state == WL_NR - 1 && wlv.n_extra == 0)
            {
                wlv.draw_state = WL_NR;
!               // Display the absolute or relative line number. After the
!               // first fill with blanks when the 'n' flag isn't in 'cpo'
!               if ((wp->w_p_nu || wp->w_p_rnu)
!                       && (wlv.row == startrow + filler_lines
!                                    || vim_strchr(p_cpo, CPO_NUMCOL) == NULL))
!               {
! #ifdef FEAT_SIGNS
!                   // If 'signcolumn' is set to 'number' and a sign is present
!                   // in 'lnum', then display the sign instead of the line
!                   // number.
!                   if ((*wp->w_p_scl == 'n' && *(wp->w_p_scl + 1) == 'u')
!                           && sign_present)
!                       get_sign_display_info(TRUE, wp, lnum, &wlv, &sattr,
!                                  wcr_attr, filler_lines, filler_todo, extra);
!                   else
! #endif
!                   {
!                     // Draw the line number (empty space after wrapping).
!                     if (wlv.row == startrow + filler_lines)
!                     {
!                       long num;
!                       char *fmt = "%*ld ";
! 
!                       if (wp->w_p_nu && !wp->w_p_rnu)
!                           // 'number' + 'norelativenumber'
!                           num = (long)lnum;
!                       else
!                       {
!                           // 'relativenumber', don't use negative numbers
!                           num = labs((long)get_cursor_rel_lnum(wp, lnum));
!                           if (num == 0 && wp->w_p_nu && wp->w_p_rnu)
!                           {
!                               // 'number' + 'relativenumber'
!                               num = lnum;
!                               fmt = "%-*ld ";
!                           }
!                       }
! 
!                       sprintf((char *)extra, fmt,
!                                               number_width(wp), num);
!                       if (wp->w_skipcol > 0)
!                           for (wlv.p_extra = extra; *wlv.p_extra == ' ';
!                                                                ++wlv.p_extra)
!                               *wlv.p_extra = '-';
! #ifdef FEAT_RIGHTLEFT
!                       if (wp->w_p_rl)             // reverse line numbers
!                       {
!                           char_u      *p1, *p2;
!                           int         t;
! 
!                           // like rl_mirror(), but keep the space at the end
!                           p2 = skipwhite(extra);
!                           p2 = skiptowhite(p2) - 1;
!                           for (p1 = skipwhite(extra); p1 < p2; ++p1, --p2)
!                           {
!                               t = *p1;
!                               *p1 = *p2;
!                               *p2 = t;
!                           }
!                       }
! #endif
!                       wlv.p_extra = extra;
!                       wlv.c_extra = NUL;
!                       wlv.c_final = NUL;
!                     }
!                     else
!                     {
!                       wlv.c_extra = ' ';
!                       wlv.c_final = NUL;
!                     }
!                     wlv.n_extra = number_width(wp) + 1;
!                     wlv.char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_N));
! #ifdef FEAT_SYN_HL
!                     // When 'cursorline' is set highlight the line number of
!                     // the current line differently.
!                     // When 'cursorlineopt' does not have "line" only
!                     // highlight the line number itself.
!                     // TODO: Can we use CursorLine instead of CursorLineNr
!                     // when CursorLineNr isn't set?
!                     if (wp->w_p_cul
!                             && lnum == wp->w_cursor.lnum
!                             && (wp->w_p_culopt_flags & CULOPT_NBR)
!                             && (wlv.row == startrow + filler_lines
!                                 || (wlv.row > startrow + filler_lines
!                                    && (wp->w_p_culopt_flags & CULOPT_LINE))))
!                       wlv.char_attr = hl_combine_attr(wcr_attr,
!                                                            HL_ATTR(HLF_CLN));
! #endif
!                     if (wp->w_p_rnu && lnum < wp->w_cursor.lnum
!                                                     && HL_ATTR(HLF_LNA) != 0)
!                         // Use LineNrAbove
!                         wlv.char_attr = hl_combine_attr(wcr_attr,
!                                                            HL_ATTR(HLF_LNA));
!                     if (wp->w_p_rnu && lnum > wp->w_cursor.lnum
!                                                     && HL_ATTR(HLF_LNB) != 0)
!                         // Use LineNrBelow
!                         wlv.char_attr = hl_combine_attr(wcr_attr,
!                                                            HL_ATTR(HLF_LNB));
!                   }
! #ifdef FEAT_SIGNS
!                   if (num_attr)
!                       wlv.char_attr = num_attr;
! #endif
!               }
            }
  
  #ifdef FEAT_LINEBREAK
--- 1519,1536 ----
  #ifdef FEAT_SIGNS
            if (wlv.draw_state == WL_SIGN - 1 && wlv.n_extra == 0)
            {
+               // Show the sign column when desired or when using Netbeans.
                wlv.draw_state = WL_SIGN;
                if (signcolumn_on(wp))
!                   get_sign_display_info(FALSE, wp, &wlv);
            }
  #endif
  
            if (wlv.draw_state == WL_NR - 1 && wlv.n_extra == 0)
            {
+               // Show the line number, if desired.
                wlv.draw_state = WL_NR;
!               handle_lnum_col(wp, &wlv, sign_present, num_attr);
            }
  
  #ifdef FEAT_LINEBREAK
***************
*** 1549,1555 ****
                // if need_showbreak is set, breakindent also applies
                if (wp->w_p_bri && (wlv.row != startrow || need_showbreak)
  # ifdef FEAT_DIFF
!                       && filler_lines == 0
  # endif
  # ifdef FEAT_PROP_POPUP
                        && !dont_use_showbreak
--- 1551,1557 ----
                // if need_showbreak is set, breakindent also applies
                if (wp->w_p_bri && (wlv.row != startrow || need_showbreak)
  # ifdef FEAT_DIFF
!                       && wlv.filler_lines == 0
  # endif
  # ifdef FEAT_PROP_POPUP
                        && !dont_use_showbreak
***************
*** 1589,1595 ****
  
                wlv.draw_state = WL_SBR;
  # ifdef FEAT_DIFF
!               if (filler_todo > 0)
                {
                    // Draw "deleted" diff line(s).
                    if (char2cells(wp->w_fill_chars.diff) > 1)
--- 1591,1597 ----
  
                wlv.draw_state = WL_SBR;
  # ifdef FEAT_DIFF
!               if (wlv.filler_todo > 0)
                {
                    // Draw "deleted" diff line(s).
                    if (char2cells(wp->w_fill_chars.diff) > 1)
***************
*** 1674,1680 ****
                   && lnum == wp->w_cursor.lnum && wlv.vcol >= 
(long)wp->w_virtcol)
                || (number_only && wlv.draw_state > WL_NR))
  #ifdef FEAT_DIFF
!                                  && filler_todo <= 0
  #endif
                )
        {
--- 1676,1682 ----
                   && lnum == wp->w_cursor.lnum && wlv.vcol >= 
(long)wp->w_virtcol)
                || (number_only && wlv.draw_state > WL_NR))
  #ifdef FEAT_DIFF
!                                  && wlv.filler_todo <= 0
  #endif
                )
        {
***************
*** 2279,2290 ****
                    {
                        // Illegal UTF-8 byte: display as <xx>.
                        // Non-BMP character : display as ? or fullwidth ?.
!                       transchar_hex(extra, mb_c);
  # ifdef FEAT_RIGHTLEFT
                        if (wp->w_p_rl)         // reverse
!                           rl_mirror(extra);
  # endif
!                       wlv.p_extra = extra;
                        c = *wlv.p_extra;
                        mb_c = mb_ptr2char_adv(&wlv.p_extra);
                        mb_utf8 = (c >= 0x80);
--- 2281,2292 ----
                    {
                        // Illegal UTF-8 byte: display as <xx>.
                        // Non-BMP character : display as ? or fullwidth ?.
!                       transchar_hex(wlv.extra, mb_c);
  # ifdef FEAT_RIGHTLEFT
                        if (wp->w_p_rl)         // reverse
!                           rl_mirror(wlv.extra);
  # endif
!                       wlv.p_extra = wlv.extra;
                        c = *wlv.p_extra;
                        mb_c = mb_ptr2char_adv(&wlv.p_extra);
                        mb_utf8 = (c >= 0x80);
***************
*** 2348,2363 ****
                            {
                                // head byte at end of line
                                mb_l = 1;
!                               transchar_nonprint(wp->w_buffer, extra, c);
                            }
                            else
                            {
                                // illegal tail byte
                                mb_l = 2;
!                               STRCPY(extra, "XX");
                            }
!                           wlv.p_extra = extra;
!                           wlv.n_extra = (int)STRLEN(extra) - 1;
                            wlv.c_extra = NUL;
                            wlv.c_final = NUL;
                            c = *wlv.p_extra++;
--- 2350,2365 ----
                            {
                                // head byte at end of line
                                mb_l = 1;
!                               transchar_nonprint(wp->w_buffer, wlv.extra, c);
                            }
                            else
                            {
                                // illegal tail byte
                                mb_l = 2;
!                               STRCPY(wlv.extra, "XX");
                            }
!                           wlv.p_extra = wlv.extra;
!                           wlv.n_extra = (int)STRLEN(wlv.extra) - 1;
                            wlv.c_extra = NUL;
                            wlv.c_final = NUL;
                            c = *wlv.p_extra++;
***************
*** 3167,3173 ****
                    (wp->w_skipcol > 0  && wlv.row == 0) :
                    wp->w_leftcol > 0)
  #ifdef FEAT_DIFF
!               && filler_todo <= 0
  #endif
                && wlv.draw_state > WL_NR
                && c != NUL)
--- 3169,3175 ----
                    (wp->w_skipcol > 0  && wlv.row == 0) :
                    wp->w_leftcol > 0)
  #ifdef FEAT_DIFF
!               && wlv.filler_todo <= 0
  #endif
                && wlv.draw_state > WL_NR
                && c != NUL)
***************
*** 3323,3329 ****
                && wp->w_p_list
                && !wp->w_p_wrap
  #ifdef FEAT_DIFF
!               && filler_todo <= 0
  #endif
                && (
  #ifdef FEAT_RIGHTLEFT
--- 3325,3331 ----
                && wp->w_p_list
                && !wp->w_p_wrap
  #ifdef FEAT_DIFF
!               && wlv.filler_todo <= 0
  #endif
                && (
  #ifdef FEAT_RIGHTLEFT
***************
*** 3367,3373 ****
                && search_attr == 0
                && area_attr == 0)
  # ifdef FEAT_DIFF
!                       && filler_todo <= 0
  # endif
                )
        {
--- 3369,3375 ----
                && search_attr == 0
                && area_attr == 0)
  # ifdef FEAT_DIFF
!                       && wlv.filler_todo <= 0
  # endif
                )
        {
***************
*** 3449,3455 ****
                    ScreenLines[wlv.off] = mb_c & 0xff;
                if (wlv.draw_state > WL_NR
  #ifdef FEAT_DIFF
!                       && filler_todo <= 0
  #endif
                        )
                    ++wlv.vcol;
--- 3451,3457 ----
                    ScreenLines[wlv.off] = mb_c & 0xff;
                if (wlv.draw_state > WL_NR
  #ifdef FEAT_DIFF
!                       && wlv.filler_todo <= 0
  #endif
                        )
                    ++wlv.vcol;
***************
*** 3571,3577 ****
        // 'relativenumber' column.
        if (wlv.draw_state > WL_NR
  #ifdef FEAT_DIFF
!               && filler_todo <= 0
  #endif
                )
            ++wlv.vcol;
--- 3573,3579 ----
        // 'relativenumber' column.
        if (wlv.draw_state > WL_NR
  #ifdef FEAT_DIFF
!               && wlv.filler_todo <= 0
  #endif
                )
            ++wlv.vcol;
***************
*** 3602,3608 ****
                && (wlv.draw_state != WL_LINE
                    || *ptr != NUL
  #ifdef FEAT_DIFF
!                   || filler_todo > 0
  #endif
  #ifdef FEAT_PROP_POPUP
                    || text_prop_above || text_prop_follows
--- 3604,3610 ----
                && (wlv.draw_state != WL_LINE
                    || *ptr != NUL
  #ifdef FEAT_DIFF
!                   || wlv.filler_todo > 0
  #endif
  #ifdef FEAT_PROP_POPUP
                    || text_prop_above || text_prop_follows
***************
*** 3629,3635 ****
            // '$' and highlighting until last column, break here.
            if ((!wp->w_p_wrap
  #ifdef FEAT_DIFF
!                       && filler_todo <= 0
  #endif
  #ifdef FEAT_PROP_POPUP
                        && !text_prop_above && !text_prop_follows
--- 3631,3637 ----
            // '$' and highlighting until last column, break here.
            if ((!wp->w_p_wrap
  #ifdef FEAT_DIFF
!                       && wlv.filler_todo <= 0
  #endif
  #ifdef FEAT_PROP_POPUP
                        && !text_prop_above && !text_prop_follows
***************
*** 3650,3656 ****
            // When the window is too narrow draw all "@" lines.
            if (wlv.draw_state != WL_LINE
  #ifdef FEAT_DIFF
!                   && filler_todo <= 0
  #endif
                    )
            {
--- 3652,3658 ----
            // When the window is too narrow draw all "@" lines.
            if (wlv.draw_state != WL_LINE
  #ifdef FEAT_DIFF
!                   && wlv.filler_todo <= 0
  #endif
                    )
            {
***************
*** 3668,3674 ****
  
            if (screen_cur_row == wlv.screen_row - 1
  #ifdef FEAT_DIFF
!                    && filler_todo <= 0
  #endif
  #ifdef FEAT_PROP_POPUP
                     && !text_prop_above && !text_prop_follows
--- 3670,3676 ----
  
            if (screen_cur_row == wlv.screen_row - 1
  #ifdef FEAT_DIFF
!                    && wlv.filler_todo <= 0
  #endif
  #ifdef FEAT_PROP_POPUP
                     && !text_prop_above && !text_prop_follows
***************
*** 3731,3746 ****
  #ifdef FEAT_LINEBREAK
            if (!dont_use_showbreak
  # ifdef FEAT_DIFF
!                   && filler_todo <= 0
  # endif
               )
                need_showbreak = TRUE;
  #endif
  #ifdef FEAT_DIFF
!           --filler_todo;
            // When the filler lines are actually below the last line of the
            // file, don't draw the line itself, break here.
!           if (filler_todo == 0 && wp->w_botfill)
                break;
  #endif
        }
--- 3733,3748 ----
  #ifdef FEAT_LINEBREAK
            if (!dont_use_showbreak
  # ifdef FEAT_DIFF
!                   && wlv.filler_todo <= 0
  # endif
               )
                need_showbreak = TRUE;
  #endif
  #ifdef FEAT_DIFF
!           --wlv.filler_todo;
            // When the filler lines are actually below the last line of the
            // file, don't draw the line itself, break here.
!           if (wlv.filler_todo == 0 && wp->w_botfill)
                break;
  #endif
        }
*** ../vim-9.0.0518/src/version.c       2022-09-20 17:57:31.826990773 +0100
--- src/version.c       2022-09-20 18:58:14.953814975 +0100
***************
*** 701,702 ****
--- 701,704 ----
  {   /* Add new patch number below this line */
+ /**/
+     519,
  /**/

-- 
Corduroy pillows: They're making headlines!

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220920175954.EEC9C1C0846%40moolenaar.net.

Raspunde prin e-mail lui