]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.1.0372: screen updating slow when 'cursorline' is set v8.1.0372
authorBram Moolenaar <Bram@vim.org>
Wed, 12 Sep 2018 19:52:18 +0000 (21:52 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 12 Sep 2018 19:52:18 +0000 (21:52 +0200)
Problem:    Screen updating slow when 'cursorline' is set.
Solution:   Only redraw the old and new cursor line, not all lines.

src/edit.c
src/move.c
src/proto/screen.pro
src/screen.c
src/version.c

index ff45bb7ee5eaf650cb8c0c41a662565c58932369..72dc586222ff83828e0d4b6c68d55d972e8add41 100644 (file)
@@ -1966,7 +1966,7 @@ edit_unputchar(void)
        if (pc_status == PC_STATUS_RIGHT)
            ++curwin->w_wcol;
        if (pc_status == PC_STATUS_RIGHT || pc_status == PC_STATUS_LEFT)
-           redrawWinline(curwin->w_cursor.lnum, FALSE);
+           redrawWinline(curwin, curwin->w_cursor.lnum, FALSE);
        else
 #endif
            screen_puts(pc_bytes, pc_row - msg_scrolled, pc_col, pc_attr);
@@ -2017,7 +2017,7 @@ undisplay_dollar(void)
     if (dollar_vcol >= 0)
     {
        dollar_vcol = -1;
-       redrawWinline(curwin->w_cursor.lnum, FALSE);
+       redrawWinline(curwin, curwin->w_cursor.lnum, FALSE);
     }
 }
 
@@ -7079,7 +7079,7 @@ check_spell_redraw(void)
        linenr_T        lnum = spell_redraw_lnum;
 
        spell_redraw_lnum = 0;
-       redrawWinline(lnum, FALSE);
+       redrawWinline(curwin, lnum, FALSE);
     }
 }
 
index b2b84868acfc77fbd45b47a27264f400ddc38c15..68f8ae4a42c496a01f8ed6f0275a6618e24fb288 100644 (file)
@@ -123,6 +123,10 @@ comp_botline(win_T *wp)
     set_empty_rows(wp, done);
 }
 
+#ifdef FEAT_SYN_HL
+static linenr_T        last_cursorline = 0;
+#endif
+
 /*
  * Redraw when w_cline_row changes and 'relativenumber' or 'cursorline' is
  * set.
@@ -140,7 +144,22 @@ redraw_for_cursorline(win_T *wp)
            && !pum_visible()
 # endif
            )
-       redraw_win_later(wp, SOME_VALID);
+    {
+#ifdef FEAT_SYN_HL
+       if (!wp->w_p_rnu && wp->w_redr_type <= VALID && last_cursorline != 0)
+       {
+           // "last_cursorline" may be set for another window, worst case we
+           // redraw too much.  This is optimized for moving the cursor around
+           // in the same window.
+           redrawWinline(wp, last_cursorline, FALSE);
+           redrawWinline(wp, wp->w_cursor.lnum, FALSE);
+           last_cursorline = wp->w_cursor.lnum;
+           redraw_win_later(wp, VALID);
+       }
+       else
+#endif
+           redraw_win_later(wp, SOME_VALID);
+    }
 }
 
 /*
index 2b8a6fd028aec44169034961dc8e7157eb984b66..7a10e3be52e7ec8e52d9c55a2194c6b1d3df4b37 100644 (file)
@@ -8,7 +8,7 @@ void redraw_buf_later(buf_T *buf, int type);
 void redraw_buf_and_status_later(buf_T *buf, int type);
 int redraw_asap(int type);
 void redraw_after_callback(int call_update_screen);
-void redrawWinline(linenr_T lnum, int invalid);
+void redrawWinline(win_T *wp, linenr_T lnum, int invalid);
 void reset_updating_screen(int may_resize_shell);
 void update_curbuf(int type);
 int update_screen(int type_arg);
index c9f9410b6a7b1e195561ba9df4ee1bb83cf99495..f82e1d60c46dce6ccf36e65c7953457743615e9f 100644 (file)
@@ -496,6 +496,7 @@ redraw_after_callback(int call_update_screen)
  */
     void
 redrawWinline(
+    win_T      *wp,
     linenr_T   lnum,
     int                invalid UNUSED) /* window line height is invalid now */
 {
@@ -503,19 +504,19 @@ redrawWinline(
     int                i;
 #endif
 
-    if (curwin->w_redraw_top == 0 || curwin->w_redraw_top > lnum)
-       curwin->w_redraw_top = lnum;
-    if (curwin->w_redraw_bot == 0 || curwin->w_redraw_bot < lnum)
-       curwin->w_redraw_bot = lnum;
-    redraw_later(VALID);
+    if (wp->w_redraw_top == 0 || wp->w_redraw_top > lnum)
+       wp->w_redraw_top = lnum;
+    if (wp->w_redraw_bot == 0 || wp->w_redraw_bot < lnum)
+       wp->w_redraw_bot = lnum;
+    redraw_win_later(wp, VALID);
 
 #ifdef FEAT_FOLDING
     if (invalid)
     {
        /* A w_lines[] entry for this lnum has become invalid. */
-       i = find_wl_entry(curwin, lnum);
+       i = find_wl_entry(wp, lnum);
        if (i >= 0)
-           curwin->w_lines[i].wl_valid = FALSE;
+           wp->w_lines[i].wl_valid = FALSE;
     }
 #endif
 }
index 88e50c1d14030f7ae57c22e642b95e486fd1f582..53dbfd965716ed27d41c25f83427ab0e606b5077 100644 (file)
@@ -794,6 +794,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    372,
 /**/
     371,
 /**/