perf(redraw): only redraw Visual area when cursor has moved (#27340)

This commit is contained in:
zeertzjq 2024-02-05 11:08:52 +08:00 committed by GitHub
parent 1ed6b9cd2c
commit 18e62c1bdb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 37 additions and 5 deletions

View File

@ -147,6 +147,9 @@ static void redraw_for_cursorcolumn(win_T *wp)
// When 'cursorcolumn' is set or "CurSearch" is in use
// need to redraw with UPD_SOME_VALID.
redraw_later(wp, UPD_SOME_VALID);
} else if (VIsual_active) {
// In Visual mode need to redraw with UPD_INVERTED.
redraw_later(wp, UPD_INVERTED);
} else if (wp->w_p_cul && (wp->w_p_culopt_flags & CULOPT_SCRLINE)) {
// When 'cursorlineopt' contains "screenline" need to redraw with UPD_VALID.
redraw_later(wp, UPD_VALID);

View File

@ -1347,10 +1347,6 @@ static void normal_redraw(NormalState *s)
show_cursor_info_later(false);
if (VIsual_active) {
redraw_curbuf_later(UPD_INVERTED); // update inverted part
}
if (must_redraw) {
update_screen();
} else {
@ -5129,6 +5125,7 @@ static void n_start_visual_mode(int c)
curwin->w_old_cursor_lnum = curwin->w_cursor.lnum;
curwin->w_old_visual_lnum = curwin->w_cursor.lnum;
}
redraw_curbuf_later(UPD_VALID);
}
/// CTRL-W: Window commands

View File

@ -1541,7 +1541,15 @@ int expand_set_formatoptions(optexpand_T *args, int *numMatches, char ***matches
/// The 'guicursor' option is changed.
const char *did_set_guicursor(optset_T *args FUNC_ATTR_UNUSED)
{
return parse_shape_opt(SHAPE_CURSOR);
const char *errmsg = parse_shape_opt(SHAPE_CURSOR);
if (errmsg != NULL) {
return errmsg;
}
if (VIsual_active) {
// In Visual mode cursor may be drawn differently.
redrawWinline(curwin, curwin->w_cursor.lnum);
}
return NULL;
}
/// The 'helpfile' option is changed.
@ -1958,6 +1966,10 @@ const char *did_set_selection(optset_T *args FUNC_ATTR_UNUSED)
if (*p_sel == NUL || check_opt_strings(p_sel, p_sel_values, false) != OK) {
return e_invarg;
}
if (VIsual_active) {
// In Visual mode cursor may be drawn differently.
redrawWinline(curwin, curwin->w_cursor.lnum);
}
return NULL;
}

View File

@ -39,6 +39,7 @@ describe('decorations providers', function()
[16] = {special = Screen.colors.Red, undercurl = true},
[17] = {foreground = Screen.colors.Red},
[18] = {bold = true, foreground = Screen.colors.SeaGreen};
[19] = {bold = true};
}
end)
@ -738,6 +739,25 @@ describe('decorations providers', function()
|
]]}
end)
it('is not invoked repeatedly in Visual mode with vim.schedule() #20235', function()
exec_lua([[_G.cnt = 0]])
setup_provider([[
function on_do(event, ...)
if event == 'win' then
vim.schedule(function() end)
_G.cnt = _G.cnt + 1
end
end
]])
feed('v')
screen:expect([[
^ |
{1:~ }|*6
{19:-- VISUAL --} |
]])
eq(2, exec_lua([[return _G.cnt]]))
end)
end)
local example_text = [[