eventloop: K_EVENT should not finish operator

normal_finish_command() and normal_prepare() assume that any pending
operator needs to be finished after any subsequent key.

Set `finish_op = false` in nv_event() to indicate that the pending
operator shouldn't be finished in normal_execute().

This is how nv_visual() indicates that 'v' or 'V' in operator-pending
mode should not finish the current pending operator.

fixes #5398
fixes #6166 (partially; mappings are still interrupted)
This commit is contained in:
Matthew Malcomson 2017-09-02 14:12:32 +01:00 committed by Justin M. Keyes
parent fec6ca7511
commit 541dde36e3
2 changed files with 60 additions and 3 deletions

View File

@ -7958,6 +7958,7 @@ static void nv_event(cmdarg_T *cap)
may_garbage_collect = false;
multiqueue_process_events(main_loop.events);
cap->retval |= CA_COMMAND_BUSY; // don't call edit() now
finish_op = false;
}
/// Trigger FocusGained event.

View File

@ -329,24 +329,80 @@ describe('api', function()
}
eq({ { {mode='n', blocking=false},
13,
{mode='n', blocking=false}, -- TODO: should be blocked=true
{mode='n', blocking=false}, -- TODO: should be blocked=true ?
1 },
NIL}, meths.call_atomic(req))
eq({mode='r', blocking=true}, nvim("get_mode"))
end)
-- TODO: bug #6166
it("during insert-mode map-pending, returns blocking=true #6166", function()
command("inoremap xx foo")
nvim("input", "ix")
eq({mode='i', blocking=true}, nvim("get_mode"))
end)
-- TODO: bug #6166
it("during normal-mode gU, returns blocking=false #6166", function()
nvim("input", "gu")
eq({mode='no', blocking=false}, nvim("get_mode"))
end)
end)
describe('RPC (K_EVENT) #6166', function()
it('does not complete/interrupt normal-mode operator', function()
helpers.insert([[
FIRST LINE
SECOND LINE]])
nvim('input', 'gg')
nvim('input', 'gu')
-- Make any non-async RPC request.
nvim('get_current_buf')
-- Buffer should not change.
helpers.expect([[
FIRST LINE
SECOND LINE]])
-- Now send input to complete the operator.
nvim("input", "j")
helpers.expect([[
first line
second line]])
end)
-- TODO: bug #6166
pending('does not complete/interrupt normal-mode mapping', function()
command("nnoremap dd :let g:foo='it worked...'<CR>")
helpers.insert([[
FIRST LINE
SECOND LINE]])
nvim('input', 'gg')
nvim('input', 'd')
helpers.expect([[
FIRST LINE
SECOND LINE]])
-- Make any non-async RPC request. (expect() does RPC, but be explicit)
nvim('get_current_buf')
-- Send input to complete the mapping.
nvim('input', 'd')
helpers.expect([[
FIRST LINE
SECOND LINE]])
eq('it worked...', eval('g:foo'))
end)
it('does not complete/interrupt insert-mode mapping', function()
command("inoremap xx foo")
helpers.insert([[
FIRST LINE
SECOND LINE]])
nvim('input', 'ix')
helpers.expect([[
FIRST LINE
SECOND LINxE]])
-- Make any non-async RPC request. (expect() does RPC, but be explicit)
nvim('get_current_buf')
-- Send input to complete the mapping.
nvim('input', 'x')
helpers.expect([[
FIRST LINE
SECOND LINxxE]]) -- TODO: should be "SECOND LINfooE" #6166
end)
end)
describe('nvim_replace_termcodes', function()
it('escapes K_SPECIAL as K_SPECIAL KS_SPECIAL KE_FILLER', function()
eq('\128\254X', helpers.nvim('replace_termcodes', '\128', true, true, true))