aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJP <17429390+resolritter@users.noreply.github.com>2022-07-18 22:11:13 -0300
committerGitHub <noreply@github.com>2022-07-19 09:11:13 +0800
commit1a655b71a888a2be86ff7d1ff534eac32fc83620 (patch)
tree417f69cf2721babbf6bc82e28b2a9f6af540c0bd
parenta80d447b47c22985a467ce9d2aaf214e966ca642 (diff)
downloadrneovim-1a655b71a888a2be86ff7d1ff534eac32fc83620.tar.gz
rneovim-1a655b71a888a2be86ff7d1ff534eac32fc83620.tar.bz2
rneovim-1a655b71a888a2be86ff7d1ff534eac32fc83620.zip
fix(lua): make it possible to cancel vim.wait() with Ctrl-C (#19217)
-rw-r--r--src/nvim/lua/executor.c6
-rw-r--r--test/functional/lua/vim_spec.lua35
2 files changed, 38 insertions, 3 deletions
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index ad03ebd1ed..fcbf36c711 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -416,9 +416,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 883e0e373b..e2347c3c11 100644
--- a/test/functional/lua/vim_spec.lua
+++ b/test/functional/lua/vim_spec.lua
@@ -2493,6 +2493,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()<CR>')
+ eq({'notification', 'ready', {}}, next_msg(500))
+ feed('<C-C>')
+ 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()<CR>')
+ eq({'notification', 'ready', {}}, next_msg(500))
+ feed('<C-C>')
+ eq({'notification', 'wait', {-2}}, next_msg(500))
+ end)
+ end)
end)
it('vim.notify_once', function()