From 403e653903fa10e2091f56c0e8076a9100dd53ae Mon Sep 17 00:00:00 2001 From: resolritter <17429390+resolritter@users.noreply.github.com> Date: Sun, 3 Jul 2022 11:54:20 -0300 Subject: [PATCH] fix(lua): make it possible to cancel vim.wait() with Ctrl-C (cherry picked from commit 2926ce7921c8d9bfa1cd2632c6063f9d737e1315) --- src/nvim/lua/executor.c | 6 +++--- test/functional/lua/vim_spec.lua | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c index 81396f1715..ba71aabd27 100644 --- a/src/nvim/lua/executor.c +++ b/src/nvim/lua/executor.c @@ -415,9 +415,9 @@ static int nlua_wait(lua_State *lstate) LOOP_PROCESS_EVENTS_UNTIL(&main_loop, loop_events, (int)timeout, - is_function ? nlua_wait_condition(lstate, - &pcall_status, - &callback_result) : false || got_int); + got_int || (is_function ? nlua_wait_condition(lstate, + &pcall_status, + &callback_result) : false)); // Stop dummy timer time_watcher_stop(tw); diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua index c28fd402e4..2a892eadfd 100644 --- a/test/functional/lua/vim_spec.lua +++ b/test/functional/lua/vim_spec.lua @@ -2451,6 +2451,41 @@ describe('lua stdlib', function() eq(false, pcall_result) end) + + describe('returns -2 when interrupted', function() + before_each(function() + local channel = meths.get_api_info()[1] + meths.set_var('channel', channel) + end) + + it('without callback', function() + exec_lua([[ + function _G.Wait() + vim.rpcnotify(vim.g.channel, 'ready') + local _, interrupted = vim.wait(4000) + vim.rpcnotify(vim.g.channel, 'wait', interrupted) + end + ]]) + feed(':lua _G.Wait()') + eq({'notification', 'ready', {}}, next_msg(500)) + feed('') + eq({'notification', 'wait', {-2}}, next_msg(500)) + end) + + it('with callback', function() + exec_lua([[ + function _G.Wait() + vim.rpcnotify(vim.g.channel, 'ready') + local _, interrupted = vim.wait(4000, function() end) + vim.rpcnotify(vim.g.channel, 'wait', interrupted) + end + ]]) + feed(':lua _G.Wait()') + eq({'notification', 'ready', {}}, next_msg(500)) + feed('') + eq({'notification', 'wait', {-2}}, next_msg(500)) + end) + end) end) it('vim.notify_once', function()