fix(event-loop): check if executed register has ended

This commit is contained in:
zeertzjq 2022-04-07 14:27:47 +08:00
parent 2a574f7aaa
commit 64802da6c4
3 changed files with 19 additions and 2 deletions

View File

@ -2074,7 +2074,7 @@ void vungetc(int c)
/// When peeking and not getting a character, reg_executing cannot be cleared
/// yet, so set a flag to clear it later.
static void check_end_reg_executing(bool advance)
void check_end_reg_executing(bool advance)
{
if (reg_executing != 0 && (typebuf.tb_maplen == 0 || pending_end_reg_executing)) {
if (advance) {

View File

@ -40,7 +40,7 @@ void state_enter(VimState *s)
int key;
getkey:
// Expand mappings first by calling vpeekc() directly.
// Apply mappings first by calling vpeekc() directly.
// - If vpeekc() returns non-NUL, there is a character already available for processing, so
// don't block for events. vgetc() may still block, in case of an incomplete UTF-8 sequence.
// - If vpeekc() returns NUL, vgetc() will block, and there are three cases:
@ -76,6 +76,9 @@ getkey:
}
if (key == K_EVENT) {
// An event handler may use the value of reg_executing.
// Clear it if it should be cleared when getting the next character.
check_end_reg_executing(true);
may_sync_undo();
}

View File

@ -6,6 +6,7 @@ local feed = helpers.feed
local clear = helpers.clear
local expect = helpers.expect
local command = helpers.command
local funcs = helpers.funcs
local meths = helpers.meths
local insert = helpers.insert
local curbufmeths = helpers.curbufmeths
@ -54,6 +55,19 @@ describe('immediately after a macro has finished executing,', function()
command([[let @a = 'gg0']])
end)
describe('reg_executing() from RPC returns an empty string', function()
it('if the macro does not end with a <Nop> mapping', function()
feed('@a')
eq('', funcs.reg_executing())
end)
it('if the macro ends with a <Nop> mapping', function()
command('nnoremap 0 <Nop>')
feed('@a')
eq('', funcs.reg_executing())
end)
end)
describe('characters from a mapping are not treated as a part of the macro #18015', function()
before_each(function()
command('nnoremap s qa')