To: vim_dev@googlegroups.com Subject: Patch 8.2.4614 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///