aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/normal.c6
-rw-r--r--test/functional/insert/ctrl_o_spec.lua11
2 files changed, 17 insertions, 0 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index db2da6a807..7e295d9ca3 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -7983,8 +7983,14 @@ static void nv_event(cmdarg_T *cap)
// not safe to perform garbage collection because there could be unreferenced
// lists or dicts being used.
may_garbage_collect = false;
+ bool may_restart = (restart_edit != 0);
multiqueue_process_events(main_loop.events);
finish_op = false;
+ if (may_restart) {
+ // Tricky: if restart_edit was set before the handler we are in ctrl-o mode
+ // but if not, the event should be allow to trigger :startinsert
+ cap->retval |= CA_COMMAND_BUSY; // don't call edit() now
+ }
}
/*
diff --git a/test/functional/insert/ctrl_o_spec.lua b/test/functional/insert/ctrl_o_spec.lua
index fbdff8a3a0..543d0a7d68 100644
--- a/test/functional/insert/ctrl_o_spec.lua
+++ b/test/functional/insert/ctrl_o_spec.lua
@@ -5,6 +5,7 @@ local eval = helpers.eval
local expect = helpers.expect
local feed = helpers.feed
local insert = helpers.insert
+local meths = helpers.meths
describe('insert-mode Ctrl-O', function()
before_each(clear)
@@ -40,4 +41,14 @@ describe('insert-mode Ctrl-O', function()
feed('ooo')
expect('hello oooworld')
end)
+
+ it("doesn't cancel Ctrl-O mode when processing event", function()
+ feed('iHello World<c-o>')
+ eq({mode='niI', blocking=false}, meths.get_mode()) -- fast event
+ eq(2, eval('1+1')) -- causes K_EVENT key
+ eq({mode='niI', blocking=false}, meths.get_mode()) -- still in ctrl-o mode
+ feed('dd')
+ eq({mode='i', blocking=false}, meths.get_mode()) -- left ctrl-o mode
+ expect('') -- executed the command
+ end)
end)