# HG changeset patch # User Bram Moolenaar # Date 1668685505 -3600 # Node ID b7834109fefe1acc0e263ca86d7e54f02c3fe878 # Parent d1c864c76e5ce81e42bba1ca52efd54ada7c2d7c patch 9.0.0892: may redraw when not needed Commit: https://github.com/vim/vim/commit/f32fb93e431e4db95a8663d86dfeb6bffa5896f6 Author: Bram Moolenaar 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) diff --git a/src/ex_getln.c b/src/ex_getln.c --- 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; diff --git a/src/move.c b/src/move.c --- 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 diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak --- 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 \ diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim --- 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 diff --git a/src/version.c b/src/version.c --- 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,