commit 4317d366691b057ffba4504c1167128a66e4e5c8
parent e4a58a7ca03457668492f8f41189ea2f23700172
Author: zeertzjq <zeertzjq@outlook.com>
Date: Wed, 5 Feb 2025 06:48:56 +0800
fix(event-loop): process input before events in getchar() (#32322)
Follow-up to #27358.
Diffstat:
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
@@ -1932,7 +1932,7 @@ static void getchar_common(typval_T *argvars, typval_T *rettv, bool allow_number
// Flush screen updates before blocking.
ui_flush();
input_get(NULL, 0, -1, typebuf.tb_change_cnt, main_loop.events);
- if (!multiqueue_empty(main_loop.events)) {
+ if (!input_available() && !multiqueue_empty(main_loop.events)) {
state_handle_k_event();
continue;
}
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
@@ -96,12 +96,19 @@ describe('API', function()
assert_alive()
end)
- it('input is processed first when followed immediately by non-fast events', function()
+ it('input is processed first if 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 }'))
+ -- Also test with getchar()
+ async_meths.nvim_command('let g:getchar = 1 | call getchar() | let g:getchar = 0')
+ eq(1, api.nvim_get_var('getchar'))
+ async_meths.nvim_input('x')
+ async_meths.nvim_exec_lua('_G.res1 = vim.g.getchar', {})
+ async_meths.nvim_exec_lua('_G.res2 = vim.g.getchar', {})
+ eq({ 0, 0 }, exec_lua('return { _G.res1, _G.res2 }'))
end)
it('does not set CA_COMMAND_BUSY #7254', function()