fix(cmdline): wrong 'incsearch' highlighting after :redraw (#27947)

Problem:  Calling :redraw from a timer callback clears 'incsearch' highlighting.
Solution: Re-apply 'incsearch' highlighting if the screen was updated.
This commit is contained in:
luukvbaal 2024-03-20 14:59:04 +01:00 committed by GitHub
parent 7549845e8d
commit c72d877c33
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 0 deletions

View File

@ -1167,6 +1167,7 @@ static int command_line_execute(VimState *state, int key)
return -1; // get another key
}
disptick_T display_tick_saved = display_tick;
CommandLineState *s = (CommandLineState *)state;
s->c = key;
@ -1178,6 +1179,10 @@ static int command_line_execute(VimState *state, int key)
} else {
map_execute_lua(false);
}
// Re-apply 'incsearch' highlighting in case it was cleared.
if (display_tick > display_tick_saved && s->is_state.did_incsearch) {
may_do_incsearch_highlighting(s->firstc, s->count, &s->is_state);
}
// nvim_select_popupmenu_item() can be called from the handling of
// K_EVENT, K_COMMAND, or K_LUA.

View File

@ -674,4 +674,18 @@ describe('search highlighting', function()
:%g@a/b^ |
]])
end)
it('incsearch is still visible after :redraw from K_EVENT', function()
fn.setline(1, { 'foo', 'bar' })
feed('/foo<CR>/bar')
screen:expect([[
foo |
{3:bar} |
{1:~ }|*4
/bar^ |
]])
command('redraw!')
-- There is an intermediate state where :redraw! removes 'incsearch' highlight.
screen:expect_unchanged(true)
end)
end)