diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 2537269c5c..bdb3983ab3 100644 --- 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 index c57f0e187a..88d198bfa5 100644 --- 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 index 954d933d9c..90d475e7e7 100644 --- 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 index 2cadfe117f..a668d47448 100644 --- 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 index e75de503ee..fb2cdb3c4a 100644 --- 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)