diff options
-rw-r--r-- | src/nvim/api/ui.c | 2 | ||||
-rw-r--r-- | src/nvim/channel.c | 2 | ||||
-rw-r--r-- | src/nvim/terminal.c | 2 | ||||
-rw-r--r-- | test/functional/core/channels_spec.lua | 49 | ||||
-rw-r--r-- | test/functional/terminal/buffer_spec.lua | 28 | ||||
-rw-r--r-- | test/functional/terminal/tui_spec.lua | 26 |
6 files changed, 106 insertions, 3 deletions
diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c index 7aa4cf4576..aa9dc1098e 100644 --- a/src/nvim/api/ui.c +++ b/src/nvim/api/ui.c @@ -510,7 +510,7 @@ void nvim_ui_term_event(uint64_t channel_id, String event, Object value, Error * MAXSIZE_TEMP_DICT(data, 1); PUT_C(data, "sequence", value); - apply_autocmds_group(EVENT_TERMRESPONSE, NULL, NULL, false, AUGROUP_ALL, NULL, NULL, + apply_autocmds_group(EVENT_TERMRESPONSE, NULL, NULL, true, AUGROUP_ALL, NULL, NULL, &DICT_OBJ(data)); } } diff --git a/src/nvim/channel.c b/src/nvim/channel.c index c964748a20..9fc0a82ca3 100644 --- a/src/nvim/channel.c +++ b/src/nvim/channel.c @@ -897,7 +897,7 @@ static void set_info_event(void **argv) tv_dict_add_dict(dict, S_LEN("info"), retval.vval.v_dict); tv_dict_set_keys_readonly(dict); - apply_autocmds(event, NULL, NULL, false, curbuf); + apply_autocmds(event, NULL, NULL, true, curbuf); restore_v_event(dict, &save_v_event); arena_mem_free(arena_finish(&arena)); diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index c0f938adda..ed757a63f9 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -243,7 +243,7 @@ static void emit_termrequest(void **argv) PUT_C(data, "cursor", ARRAY_OBJ(cursor)); buf_T *buf = handle_get_buffer(term->buf_handle); - apply_autocmds_group(EVENT_TERMREQUEST, NULL, NULL, false, AUGROUP_ALL, buf, NULL, + apply_autocmds_group(EVENT_TERMREQUEST, NULL, NULL, true, AUGROUP_ALL, buf, NULL, &DICT_OBJ(data)); xfree(sequence); diff --git a/test/functional/core/channels_spec.lua b/test/functional/core/channels_spec.lua index 7b10eb05ef..11617905dd 100644 --- a/test/functional/core/channels_spec.lua +++ b/test/functional/core/channels_spec.lua @@ -3,6 +3,8 @@ local n = require('test.functional.testnvim')() local clear, eq, eval, next_msg, ok, source = n.clear, t.eq, n.eval, n.next_msg, t.ok, n.source local command, fn, api = n.command, n.fn, n.api +local feed = n.feed +local exec_lua = n.exec_lua local matches = t.matches local sleep = vim.uv.sleep local get_session, set_session = n.get_session, n.set_session @@ -416,6 +418,53 @@ describe('channels', function() -- works correctly with no output eq({ 'notification', 'exit', { id, 1, { '' } } }, next_msg()) end) + + it('ChanOpen works with vim.wait() from another autocommand #32706', function() + exec_lua([[ + vim.api.nvim_create_autocmd('ChanOpen', { + callback = function(ev) + _G.chan = vim.v.event.info.id + end, + }) + vim.api.nvim_create_autocmd('InsertEnter', { + buffer = 0, + callback = function() + local chan = vim.fn.jobstart({ 'cat' }) + _G.result = vim.wait(3000, function() + return _G.chan == chan + end) + end, + }) + ]]) + feed('i') + retry(nil, 4000, function() + eq(true, exec_lua('return _G.result')) + end) + end) + + it('ChanInfo works with vim.wait() from another autocommand #32706', function() + exec_lua([[ + vim.api.nvim_create_autocmd('ChanInfo', { + callback = function(ev) + _G.foo = vim.v.event.info.client.attributes.foo + end, + }) + vim.api.nvim_create_autocmd('InsertEnter', { + buffer = 0, + callback = function() + local chan = vim.fn.jobstart({ 'cat' }) + _G.result = vim.wait(3000, function() + return _G.foo == 'bar' + end) + end, + }) + ]]) + feed('i') + api.nvim_set_client_info('test', {}, 'remote', {}, { foo = 'bar' }) + retry(nil, 4000, function() + eq(true, exec_lua('return _G.result')) + end) + end) end) describe('loopback', function() diff --git a/test/functional/terminal/buffer_spec.lua b/test/functional/terminal/buffer_spec.lua index 4fd348af41..599adc87e1 100644 --- a/test/functional/terminal/buffer_spec.lua +++ b/test/functional/terminal/buffer_spec.lua @@ -390,6 +390,34 @@ describe(':terminal buffer', function() }, exec_lua('return _G.input')) end) + it('works with vim.wait() from another autocommand #32706', function() + command('autocmd! nvim.terminal TermRequest') + exec_lua([[ + local term = vim.api.nvim_open_term(0, {}) + vim.api.nvim_create_autocmd('TermRequest', { + buffer = 0, + callback = function(ev) + _G.sequence = ev.data.sequence + _G.v_termrequest = vim.v.termrequest + end, + }) + vim.api.nvim_create_autocmd('TermEnter', { + buffer = 0, + callback = function() + vim.api.nvim_chan_send(term, '\027]11;?\027\\') + _G.result = vim.wait(3000, function() + local expected = '\027]11;?' + return _G.sequence == expected and _G.v_termrequest == expected + end) + end, + }) + ]]) + feed('i') + retry(nil, 4000, function() + eq(true, exec_lua('return _G.result')) + end) + end) + it('includes cursor position #31609', function() command('autocmd! nvim.terminal TermRequest') local screen = Screen.new(50, 10) diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua index a2d5b39f84..5e452ce9c9 100644 --- a/test/functional/terminal/tui_spec.lua +++ b/test/functional/terminal/tui_spec.lua @@ -2222,6 +2222,32 @@ describe('TUI', function() eq({ { id = 0xE1EA0000, url = 'https://example.com' } }, exec_lua([[return _G.urls]])) end) end) + + it('TermResponse works with vim.wait() from another autocommand #32706', function() + child_exec_lua([[ + _G.termresponse = nil + vim.api.nvim_create_autocmd('TermResponse', { + callback = function(ev) + _G.sequence = ev.data.sequence + _G.v_termresponse = vim.v.termresponse + end, + }) + vim.api.nvim_create_autocmd('InsertEnter', { + buffer = 0, + callback = function() + _G.result = vim.wait(3000, function() + local expected = '\027P1+r5463' + return _G.sequence == expected and _G.v_termresponse == expected + end) + end, + }) + ]]) + feed_data('i') + feed_data('\027P1+r5463\027\\') + retry(nil, 4000, function() + eq(true, child_exec_lua('return _G.result')) + end) + end) end) describe('TUI', function() |