# HG changeset patch # User Bram Moolenaar # Date 1648550703 -7200 # Node ID 3f6c0a5c99bbc7c28285d05e26622b9f37175f5c # Parent 3ea4c66b4988722f5c1fa0c7acf9f8c854106165 patch 8.2.4644: redrawing too often when 'relativenumber' is set Commit: https://github.com/vim/vim/commit/1624639ec8a6c3c99e417a2990f2f02f0d0b6e10 Author: Lewis Russell Date: Tue Mar 29 11:38:17 2022 +0100 patch 8.2.4644: redrawing too often when 'relativenumber' is set Problem: Redrawing too often when 'relativenumber' is set. Solution: Only redraw when the cursor line changed. (Lewis Russell, closes #10040) diff --git a/src/change.c b/src/change.c --- a/src/change.c +++ b/src/change.c @@ -641,7 +641,7 @@ changed_common( set_topline(wp, wp->w_topline); #endif // Relative numbering may require updating more. - if (wp->w_p_rnu) + if (wp->w_p_rnu && xtra != 0) redraw_win_later(wp, SOME_VALID); #ifdef FEAT_SYN_HL // Cursor line highlighting probably need to be updated with diff --git a/src/drawscreen.c b/src/drawscreen.c --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -2507,11 +2507,11 @@ win_update(win_T *wp) } else { - if (wp->w_p_rnu) + if (wp->w_p_rnu && wp->w_last_cursor_lnum_rnu != wp->w_cursor.lnum) { #ifdef FEAT_FOLDING - // 'relativenumber' set: The text doesn't need to be drawn, but - // the number column nearly always does. + // 'relativenumber' set and the cursor moved vertically: The + // text doesn't need to be drawn, but the number column does. fold_count = foldedCount(wp, lnum, &win_foldinfo); if (fold_count != 0) fold_line(wp, fold_count, &win_foldinfo, lnum, row); @@ -2553,6 +2553,7 @@ win_update(win_T *wp) // update w_last_cursorline. wp->w_last_cursorline = wp->w_p_cul ? wp->w_cursor.lnum : 0; #endif + wp->w_last_cursor_lnum_rnu = wp->w_p_rnu ? wp->w_cursor.lnum : 0; #ifdef FEAT_VTP // Rewrite the character at the end of the screen line. diff --git a/src/structs.h b/src/structs.h --- a/src/structs.h +++ b/src/structs.h @@ -3465,6 +3465,9 @@ struct window_S colnr_T w_old_visual_col; // last known start of visual part colnr_T w_old_curswant; // last known value of Curswant + linenr_T w_last_cursor_lnum_rnu; // cursor lnum when 'rnu' was last + // redrawn + lcs_chars_T w_lcs_chars; // 'listchars' characters /* diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4644, +/**/ 4643, /**/ 4642,