diff options
-rw-r--r-- | src/edit.c | 6 | ||||
-rw-r--r-- | src/move.c | 21 | ||||
-rw-r--r-- | src/proto/screen.pro | 2 | ||||
-rw-r--r-- | src/screen.c | 15 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 34 insertions, 12 deletions
diff --git a/src/edit.c b/src/edit.c index ff45bb7ee..72dc58622 100644 --- a/src/edit.c +++ b/src/edit.c @@ -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); } } diff --git a/src/move.c b/src/move.c index b2b84868a..68f8ae4a4 100644 --- a/src/move.c +++ b/src/move.c @@ -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); + } } /* diff --git a/src/proto/screen.pro b/src/proto/screen.pro index 2b8a6fd02..7a10e3be5 100644 --- a/src/proto/screen.pro +++ b/src/proto/screen.pro @@ -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); diff --git a/src/screen.c b/src/screen.c index c9f9410b6..f82e1d60c 100644 --- a/src/screen.c +++ b/src/screen.c @@ -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 } diff --git a/src/version.c b/src/version.c index 88e50c1d1..53dbfd965 100644 --- a/src/version.c +++ b/src/version.c @@ -795,6 +795,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 372, +/**/ 371, /**/ 370, |