fix(inccommand): avoid unnecessary redraw when not showing (#20244)

This commit is contained in:
zeertzjq 2022-09-19 12:37:25 +08:00 committed by GitHub
parent 647da34bbd
commit 7bd4c8e8ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 60 additions and 3 deletions

View File

@ -2385,6 +2385,7 @@ static int command_line_changed(CommandLineState *s)
// Trigger CmdlineChanged autocommands.
do_autocmd_cmdlinechanged(s->firstc > 0 ? s->firstc : '-');
const bool prev_cmdpreview = cmdpreview;
if (s->firstc == ':'
&& current_sctx.sc_sid == 0 // only if interactive
&& *p_icm != NUL // 'inccommand' is set
@ -2393,10 +2394,11 @@ static int command_line_changed(CommandLineState *s)
&& !vpeekc_any()
&& cmdpreview_may_show(s)) {
// 'inccommand' preview has been shown.
} else if (cmdpreview) {
cmdpreview = false;
update_screen(UPD_SOME_VALID); // Clear 'inccommand' preview.
} else {
cmdpreview = false;
if (prev_cmdpreview) {
update_screen(UPD_SOME_VALID); // Clear 'inccommand' preview.
}
if (s->xpc.xp_context == EXPAND_NOTHING && (KeyTyped || vpeekc() == NUL)) {
may_do_incsearch_highlighting(s->firstc, s->count, &s->is_state);
}

View File

@ -1190,6 +1190,8 @@ describe(":substitute, inccommand=split", function()
end)
it("deactivates if 'redrawtime' is exceeded #5602", function()
-- prevent redraws from 'incsearch'
meths.set_option('incsearch', false)
-- Assert that 'inccommand' is ENABLED initially.
eq("split", eval("&inccommand"))
-- Set 'redrawtime' to minimal value, to ensure timeout is triggered.
@ -2972,6 +2974,59 @@ it(':substitute with inccommand, does not crash if range contains invalid marks'
]])
end)
it(':substitute with inccommand, no unnecessary redraw if preview is not shown', function()
local screen = Screen.new(60, 6)
clear()
common_setup(screen, 'split', 'test')
feed(':ls<CR>')
screen:expect([[
test |
{15:~ }|
{11: }|
:ls |
1 %a + "[No Name]" line 1 |
{13:Press ENTER or type command to continue}^ |
]])
feed(':s')
-- no unnecessary redraw, so messages are still shown
screen:expect([[
test |
{15:~ }|
{11: }|
:ls |
1 %a + "[No Name]" line 1 |
:s^ |
]])
feed('o')
screen:expect([[
test |
{15:~ }|
{11: }|
:ls |
1 %a + "[No Name]" line 1 |
:so^ |
]])
feed('<BS>')
screen:expect([[
test |
{15:~ }|
{11: }|
:ls |
1 %a + "[No Name]" line 1 |
:s^ |
]])
feed('/test')
-- now inccommand is shown, so screen is redrawn
screen:expect([[
{12:test} |
{15:~ }|
{15:~ }|
{15:~ }|
{15:~ }|
:s/test^ |
]])
end)
it(":substitute doesn't crash with inccommand, if undo is empty #12932", function()
local screen = Screen.new(10,5)
clear()