commit d7359a87425dc38efda4f74bd580bae9946abe31
parent 4e6096a67fe9860994be38bcd155e7c47313205e
Author: zeertzjq <zeertzjq@outlook.com>
Date: Wed, 1 Nov 2023 12:16:37 +0800
fix(startup): trigger UIEnter for the correct channel (#25860)
Diffstat:
5 files changed, 36 insertions(+), 23 deletions(-)
diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c
@@ -2570,6 +2570,9 @@ void do_autocmd_uienter(uint64_t chanid, bool attached)
{
static bool recursive = false;
+ if (starting == NO_SCREEN) {
+ return; // user config hasn't been sourced yet
+ }
if (recursive) {
return; // disallow recursion
}
diff --git a/src/nvim/main.c b/src/nvim/main.c
@@ -589,7 +589,7 @@ int main(int argc, char **argv)
apply_autocmds(EVENT_VIMENTER, NULL, NULL, false, curbuf);
TIME_MSG("VimEnter autocommands");
if (use_remote_ui) {
- do_autocmd_uienter(CHAN_STDIO, true);
+ do_autocmd_uienter_all();
TIME_MSG("UIEnter autocommands");
}
diff --git a/src/nvim/ui.c b/src/nvim/ui.c
@@ -337,6 +337,16 @@ void vim_beep(unsigned val)
}
}
+/// Trigger UIEnter for all attached UIs.
+/// Used on startup after VimEnter.
+void do_autocmd_uienter_all(void)
+{
+ for (size_t i = 0; i < ui_count; i++) {
+ UIData *data = uis[i]->data;
+ do_autocmd_uienter(data->channel_id, true);
+ }
+}
+
void ui_attach_impl(UI *ui, uint64_t chanid)
{
if (ui_count == MAX_UI_COUNT) {
diff --git a/test/functional/api/ui_spec.lua b/test/functional/api/ui_spec.lua
@@ -60,14 +60,13 @@ describe('nvim_ui_attach()', function()
end)
it('autocmds UIEnter/UILeave', function()
- clear{
- args_rm={'--headless'},
- args={
- '--cmd', 'let g:evs = []',
- '--cmd', 'autocmd UIEnter * :call add(g:evs, "UIEnter") | let g:uienter_ev = deepcopy(v:event)',
- '--cmd', 'autocmd UILeave * :call add(g:evs, "UILeave") | let g:uileave_ev = deepcopy(v:event)',
- '--cmd', 'autocmd VimEnter * :call add(g:evs, "VimEnter")',
- }}
+ clear{args_rm={'--headless'}}
+ exec([[
+ let g:evs = []
+ autocmd UIEnter * call add(g:evs, "UIEnter") | let g:uienter_ev = deepcopy(v:event)
+ autocmd UILeave * call add(g:evs, "UILeave") | let g:uileave_ev = deepcopy(v:event)
+ autocmd VimEnter * call add(g:evs, "VimEnter")
+ ]])
local screen = Screen.new()
screen:attach()
eq({chan=1}, eval('g:uienter_ev'))
diff --git a/test/functional/ui/embed_spec.lua b/test/functional/ui/embed_spec.lua
@@ -159,19 +159,21 @@ describe('--embed --listen UI', function()
local child_session = helpers.connect(child_server)
- local info_ok, apiinfo = child_session:request('nvim_get_api_info')
- assert(info_ok)
- assert(#apiinfo == 2)
+ local info_ok, api_info = child_session:request('nvim_get_api_info')
+ ok(info_ok)
+ eq(2, #api_info)
+ ok(api_info[1] > 2, 'channel_id > 2', api_info[1])
child_session:request('nvim_exec2', [[
- let g:vim_entered=0
- autocmd VimEnter * call execute("let g:vim_entered=1")
+ let g:evs = []
+ autocmd UIEnter * call add(g:evs, $"UIEnter:{v:event.chan}")
+ autocmd VimEnter * call add(g:evs, "VimEnter")
]], {})
- -- g:vim_entered shouldn't be set to 1 until after attach
- local var_ok, var = child_session:request('nvim_get_var', 'vim_entered')
- assert(var_ok)
- ok(var == 0)
+ -- VimEnter and UIEnter shouldn't be triggered until after attach
+ local var_ok, var = child_session:request('nvim_get_var', 'evs')
+ ok(var_ok)
+ eq({}, var)
local child_screen = Screen.new(40, 6)
child_screen:attach(nil, child_session)
@@ -186,10 +188,9 @@ describe('--embed --listen UI', function()
[1] = {foreground = Screen.colors.Blue, bold = true};
}}
- -- g:vim_entered should now be set to 1
- var_ok, var = child_session:request('nvim_get_var', 'vim_entered')
- assert(var_ok)
- ok(var == 1)
-
+ -- VimEnter and UIEnter should now be triggered
+ var_ok, var = child_session:request('nvim_get_var', 'evs')
+ ok(var_ok)
+ eq({'VimEnter', ('UIEnter:%d'):format(api_info[1])}, var)
end)
end)