summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-09-12 21:52:18 +0200
committerBram Moolenaar <Bram@vim.org>2018-09-12 21:52:18 +0200
commit90a997987dbbe43af3c15118a35f658f0f037d1d (patch)
tree53f3974a235a4bc9c0a266fde3c5e86d5fde5ac6
parent643b6140873e0e6f297df0cbca11bc1ea1f21925 (diff)
downloadvim-git-90a997987dbbe43af3c15118a35f658f0f037d1d.tar.gz
patch 8.1.0372: screen updating slow when 'cursorline' is setv8.1.0372
Problem: Screen updating slow when 'cursorline' is set. Solution: Only redraw the old and new cursor line, not all lines.
-rw-r--r--src/edit.c6
-rw-r--r--src/move.c21
-rw-r--r--src/proto/screen.pro2
-rw-r--r--src/screen.c15
-rw-r--r--src/version.c2
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,