changeset 31115:b7834109fefe v9.0.0892

patch 9.0.0892: may redraw when not needed Commit: https://github.com/vim/vim/commit/f32fb93e431e4db95a8663d86dfeb6bffa5896f6 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Nov 17 11:34:38 2022 +0000 patch 9.0.0892: may redraw when not needed Problem: May redraw when not needed, causing slow scrolling. Solution: Do not redraw when w_skipcol doesn't change. When w_skipcol changes only redraw from the top. (issue #11559)
author Bram Moolenaar <Bram@vim.org>
date Thu, 17 Nov 2022 12:45:05 +0100
parents d1c864c76e5c
children 420dd432f723
files src/ex_getln.c src/move.c src/testdir/Make_all.mak src/testdir/test_alot.vim src/version.c
diffstat 5 files changed, 29 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -393,6 +393,7 @@ finish_incsearch_highlighting(
 	magic_overruled = is_state->magic_overruled_save;
 
 	validate_cursor();	// needed for TAB
+	status_redraw_all();
 	redraw_all_later(UPD_SOME_VALID);
 	if (call_update_screen)
 	    update_screen(UPD_SOME_VALID);
@@ -559,6 +560,7 @@ may_do_incsearch_highlighting(
     }
 
     validate_cursor();
+
     // May redraw the status line to show the cursor position.
     if (p_ru && curwin->w_status_height > 0)
 	curwin->w_redr_status = TRUE;
--- a/src/move.c
+++ b/src/move.c
@@ -202,6 +202,23 @@ redraw_for_cursorcolumn(win_T *wp)
 #endif
 
 /*
+ * Set curwin->s_skipcol to zero and redraw later if needed.
+ */
+    static void
+reset_skipcol(void)
+{
+    if (curwin->w_skipcol != 0)
+    {
+	curwin->w_skipcol = 0;
+
+	// Should use the least expensive way that displays all that changed.
+	// UPD_NOT_VALID is too expensive, UPD_REDRAW_TOP does not redraw
+	// enough when the top line gets another screen line.
+	redraw_later(UPD_SOME_VALID);
+    }
+}
+
+/*
  * Update curwin->w_topline and redraw if necessary.
  * Used to update the screen before printing a message.
  */
@@ -458,13 +475,9 @@ update_topline(void)
 	    )
     {
 	dollar_vcol = -1;
-	if (curwin->w_skipcol != 0)
-	{
-	    curwin->w_skipcol = 0;
-	    redraw_later(UPD_NOT_VALID);
-	}
-	else
-	    redraw_later(UPD_VALID);
+	redraw_later(UPD_VALID);
+	reset_skipcol();
+
 	// May need to set w_skipcol when cursor in w_topline.
 	if (curwin->w_cursor.lnum == curwin->w_topline)
 	    validate_cursor();
@@ -1319,7 +1332,7 @@ curs_columns(
     else if (!curwin->w_p_sms)
 	curwin->w_skipcol = 0;
     if (prev_skipcol != curwin->w_skipcol)
-	redraw_later(UPD_NOT_VALID);
+	redraw_later(UPD_SOME_VALID);
 
 #ifdef FEAT_SYN_HL
     redraw_for_cursorcolumn(curwin);
@@ -1849,11 +1862,7 @@ adjust_skipcol(void)
     if (curwin->w_cline_height == curwin->w_height)
     {
 	// the line just fits in the window, don't scroll
-	if (curwin->w_skipcol != 0)
-	{
-	    curwin->w_skipcol = 0;
-	    redraw_later(UPD_NOT_VALID);
-	}
+	reset_skipcol();
 	return;
     }
 
@@ -2302,10 +2311,7 @@ scroll_cursor_top(int min_scroll, int al
 #endif
 	// TODO: if the line doesn't fit may optimize w_skipcol
 	if (curwin->w_topline == curwin->w_cursor.lnum)
-	{
-	    curwin->w_skipcol = 0;
-	    redraw_later(UPD_NOT_VALID);
-	}
+	    reset_skipcol();
 	if (curwin->w_topline != old_topline
 		|| curwin->w_skipcol != old_skipcol
 #ifdef FEAT_DIFF
@@ -2737,7 +2743,7 @@ cursor_correct(void)
 	if (curwin->w_cline_height == curwin->w_height)
 	{
 	    // The cursor line just fits in the window, don't scroll.
-	    curwin->w_skipcol = 0;
+	    reset_skipcol();
 	    return;
 	}
 	// TODO: If the cursor line doesn't fit in the window then only adjust
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -484,6 +484,7 @@ NEW_TESTS_RES = \
 	test_retab.res \
 	test_ruby.res \
 	test_scriptnames.res \
+	test_scroll_opt.res \
 	test_scrollbind.res \
 	test_search.res \
 	test_search_stat.res \
--- a/src/testdir/test_alot.vim
+++ b/src/testdir/test_alot.vim
@@ -19,7 +19,6 @@ source test_global.vim
 source test_move.vim
 source test_put.vim
 source test_reltime.vim
-source test_scroll_opt.vim
 source test_searchpos.vim
 source test_set.vim
 source test_shift.vim
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    892,
+/**/
     891,
 /**/
     890,