Patch 8.2.4614
Problem:    Redrawing too much when 'cursorline' is set and jumping around.
Solution:   Rely on win_update() to redraw the current and previous cursor
            line, do not mark lines as modified. (closes #9996)
Files:      src/drawline.c, src/drawscreen.c, src/move.c, src/proto/move.pro,
            src/option.c


*** ../vim-8.2.4613/src/drawline.c      2022-03-22 20:42:09.174172862 +0000
--- src/drawline.c      2022-03-23 14:38:42.624419902 +0000
***************
*** 945,952 ****
      if (wp->w_p_cul && lnum == wp->w_cursor.lnum)
      {
        // Do not show the cursor line in the text when Visual mode is active,
!       // because it's not clear what is selected then.  Do update
!       // w_last_cursorline.
        if (!(wp == curwin && VIsual_active)
                                         && wp->w_p_culopt_flags != CULOPT_NBR)
        {
--- 945,951 ----
      if (wp->w_p_cul && lnum == wp->w_cursor.lnum)
      {
        // Do not show the cursor line in the text when Visual mode is active,
!       // because it's not clear what is selected then.
        if (!(wp == curwin && VIsual_active)
                                         && wp->w_p_culopt_flags != CULOPT_NBR)
        {
***************
*** 971,988 ****
                else
  # endif
                    line_attr = cul_attr;
-               wp->w_last_cursorline = wp->w_cursor.lnum;
            }
            else
            {
                line_attr_save = line_attr;
-               wp->w_last_cursorline = 0;
                margin_columns_win(wp, &left_curline_col, &right_curline_col);
            }
            area_highlighting = TRUE;
        }
-       else
-           wp->w_last_cursorline = wp->w_cursor.lnum;
      }
  #endif
  
--- 970,983 ----
*** ../vim-8.2.4613/src/drawscreen.c    2022-03-22 20:42:09.174172862 +0000
--- src/drawscreen.c    2022-03-23 14:47:29.294942829 +0000
***************
*** 1468,1476 ****
  # define DID_FOLD 3   // updated a folded line
      int               did_update = DID_NONE;
      linenr_T  syntax_last_parsed = 0;         // last parsed text line
-     // remember the current w_last_cursorline, it changes when drawing the new
-     // cursor line
-     linenr_T  last_cursorline = wp->w_last_cursorline;
  #endif
      linenr_T  mod_top = 0;
      linenr_T  mod_bot = 0;
--- 1468,1473 ----
***************
*** 2245,2252 ****
  #endif
                                ))))
  #ifdef FEAT_SYN_HL
!               || (wp->w_p_cul && (lnum == wp->w_cursor.lnum
!                                                  || lnum == last_cursorline))
  #endif
                                )
        {
--- 2242,2249 ----
  #endif
                                ))))
  #ifdef FEAT_SYN_HL
!               || (wp->w_p_cul && lnum == wp->w_cursor.lnum)
!               || lnum == wp->w_last_cursorline
  #endif
                                )
        {
***************
*** 2551,2556 ****
--- 2548,2559 ----
  
      // End of loop over all window lines.
  
+ #ifdef FEAT_SYN_HL
+     // Now that the window has been redrawn with the old and new cursor line,
+     // update w_last_cursorline.
+     wp->w_last_cursorline = wp->w_p_cul ? wp->w_cursor.lnum : 0;
+ #endif
+ 
  #ifdef FEAT_VTP
      // Rewrite the character at the end of the screen line.
      // See the version that was fixed.
*** ../vim-8.2.4613/src/move.c  2022-02-15 13:40:13.508939677 +0000
--- src/move.c  2022-03-23 14:38:42.624419902 +0000
***************
*** 115,128 ****
      set_empty_rows(wp, done);
  }
  
- #ifdef FEAT_SYN_HL
-     void
- reset_cursorline(void)
- {
-     curwin->w_last_cursorline = 0;
- }
- #endif
- 
  /*
   * Redraw when w_cline_row changes and 'relativenumber' or 'cursorline' is
   * set.
--- 115,120 ----
***************
*** 138,161 ****
            && (wp->w_valid & VALID_CROW) == 0
            && !pum_visible())
      {
!       if (wp->w_p_rnu)
!           // win_line() will redraw the number column only.
!           redraw_win_later(wp, VALID);
! #ifdef FEAT_SYN_HL
!       if (wp->w_p_cul)
!       {
!           if (wp->w_redr_type <= VALID && wp->w_last_cursorline != 0)
!           {
!               // "w_last_cursorline" may be outdated, worst case we redraw
!               // too much.  This is optimized for moving the cursor around in
!               // the current window.
!               redrawWinline(wp, wp->w_last_cursorline);
!               redrawWinline(wp, wp->w_cursor.lnum);
!           }
!           else
!               redraw_win_later(wp, SOME_VALID);
!       }
! #endif
      }
  }
  
--- 130,137 ----
            && (wp->w_valid & VALID_CROW) == 0
            && !pum_visible())
      {
!       // win_line() will redraw the number column and cursorline only.
!       redraw_win_later(wp, VALID);
      }
  }
  
*** ../vim-8.2.4613/src/proto/move.pro  2020-12-23 13:35:56.963016983 +0000
--- src/proto/move.pro  2022-03-23 14:38:42.624419902 +0000
***************
*** 1,5 ****
  /* move.c */
- void reset_cursorline(void);
  void redraw_for_cursorline(win_T *wp);
  void update_topline_redraw(void);
  void update_topline(void);
--- 1,4 ----
*** ../vim-8.2.4613/src/option.c        2022-02-24 13:28:36.570222354 +0000
--- src/option.c        2022-03-23 14:38:42.624419902 +0000
***************
*** 2782,2792 ****
        p_lrm = !p_lnr;
  #endif
  
- #ifdef FEAT_SYN_HL
-     else if ((int *)varp == &curwin->w_p_cul && !value && old_value)
-       reset_cursorline();
- #endif
- 
  #ifdef FEAT_PERSISTENT_UNDO
      // 'undofile'
      else if ((int *)varp == &curbuf->b_p_udf || (int *)varp == &p_udf)
--- 2782,2787 ----
*** ../vim-8.2.4613/src/version.c       2022-03-23 13:54:47.968796508 +0000
--- src/version.c       2022-03-23 14:45:56.115189681 +0000
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     4614,
  /**/

-- 
GUARD #1:  What -- a swallow carrying a coconut?
ARTHUR:    It could grip it by the husk!
GUARD #1:  It's not a question of where he grips it!  It's a simple question
           of weight ratios!  A five ounce bird could not carry a 1 pound
           coconut.
                                  The Quest for the Holy Grail (Monty Python)

 /// 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/20220323145621.D13EB1C0497%40moolenaar.net.

Raspunde prin e-mail lui