From 6725565258930ba430cfb925fd1671596a8a4342 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 7 Feb 2024 12:11:22 +0800 Subject: [PATCH] fix(event-loop): process input before events (#27358) Problem: When nvim_input is followed immediately by non-fast events on RPC, both events and input are available after the polling done by the os_inchar() in state_enter(), but state_enter() then chooses to process events even if input is available, which is inconsistent with state_handle_k_event() that stops processing events once input is available. Solution: Also check for available input after the os_inchar() in state_enter(). --- src/nvim/state.c | 2 +- test/functional/api/vim_spec.lua | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/nvim/state.c b/src/nvim/state.c index 527acee306..0df060ecf4 100644 --- a/src/nvim/state.c +++ b/src/nvim/state.c @@ -79,7 +79,7 @@ getkey: // mapping engine. os_inchar(NULL, 0, -1, typebuf.tb_change_cnt, main_loop.events); // If an event was put into the queue, we send K_EVENT directly. - if (!multiqueue_empty(main_loop.events)) { + if (!input_available() && !multiqueue_empty(main_loop.events)) { key = K_EVENT; } else { goto getkey; diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 5cf48412a8..4cd46f5e91 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -95,6 +95,14 @@ describe('API', function() assert_alive() end) + it('input is processed first when followed immediately by non-fast events', function() + api.nvim_set_current_line('ab') + async_meths.nvim_input('x') + async_meths.nvim_exec_lua('_G.res1 = vim.api.nvim_get_current_line()', {}) + async_meths.nvim_exec_lua('_G.res2 = vim.api.nvim_get_current_line()', {}) + eq({ 'b', 'b' }, exec_lua('return { _G.res1, _G.res2 }')) + end) + it('does not set CA_COMMAND_BUSY #7254', function() command('split') command('autocmd WinEnter * startinsert')