diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-01-24 15:39:43 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-24 15:39:43 +0800 |
commit | fca39eeabba84853960fb514edf402fbf8f586e3 (patch) | |
tree | 77641edde2b60200481898b8be3885434b6477fa | |
parent | bcdbf77537cec4567a334a39fd5965a3f5668a1a (diff) | |
download | rneovim-fca39eeabba84853960fb514edf402fbf8f586e3.tar.gz rneovim-fca39eeabba84853960fb514edf402fbf8f586e3.tar.bz2 rneovim-fca39eeabba84853960fb514edf402fbf8f586e3.zip |
fix(api): don't allow hiding aucmd_win from another tabpage (#21975)
-rw-r--r-- | src/nvim/api/window.c | 7 | ||||
-rw-r--r-- | test/functional/autocmd/autocmd_spec.lua | 34 |
2 files changed, 40 insertions, 1 deletions
diff --git a/src/nvim/api/window.c b/src/nvim/api/window.c index 76ea4b6d7f..17cc1447ac 100644 --- a/src/nvim/api/window.c +++ b/src/nvim/api/window.c @@ -369,11 +369,16 @@ void nvim_win_hide(Window window, Error *err) tabpage_T *tabpage = win_find_tabpage(win); TryState tstate; try_enter(&tstate); - if (tabpage == curtab) { + + // Never close the autocommand window. + if (is_aucmd_win(win)) { + emsg(_(e_autocmd_close)); + } else if (tabpage == curtab) { win_close(win, false); } else { win_close_othertab(win, false, tabpage); } + vim_ignored = try_leave(&tstate, err); } diff --git a/test/functional/autocmd/autocmd_spec.lua b/test/functional/autocmd/autocmd_spec.lua index 60ee9fa3a4..fb5bab445c 100644 --- a/test/functional/autocmd/autocmd_spec.lua +++ b/test/functional/autocmd/autocmd_spec.lua @@ -9,6 +9,7 @@ local neq = helpers.neq local eval = helpers.eval local feed = helpers.feed local clear = helpers.clear +local matches = helpers.matches local meths = helpers.meths local pcall_err = helpers.pcall_err local funcs = helpers.funcs @@ -435,6 +436,39 @@ describe('autocmd', function() end) end) + it('closing `aucmd_win` using API gives E813', function() + exec_lua([[ + vim.cmd('tabnew') + _G.buf = vim.api.nvim_create_buf(true, true) + ]]) + matches('Vim:E813: Cannot close autocmd window$', pcall_err(exec_lua, [[ + vim.api.nvim_buf_call(_G.buf, function() + local win = vim.api.nvim_get_current_win() + vim.api.nvim_win_close(win, true) + end) + ]])) + matches('Vim:E813: Cannot close autocmd window$', pcall_err(exec_lua, [[ + vim.api.nvim_buf_call(_G.buf, function() + local win = vim.api.nvim_get_current_win() + vim.cmd('tabnext') + vim.api.nvim_win_close(win, true) + end) + ]])) + matches('Vim:E813: Cannot close autocmd window$', pcall_err(exec_lua, [[ + vim.api.nvim_buf_call(_G.buf, function() + local win = vim.api.nvim_get_current_win() + vim.api.nvim_win_hide(win) + end) + ]])) + matches('Vim:E813: Cannot close autocmd window$', pcall_err(exec_lua, [[ + vim.api.nvim_buf_call(_G.buf, function() + local win = vim.api.nvim_get_current_win() + vim.cmd('tabnext') + vim.api.nvim_win_hide(win) + end) + ]])) + end) + it(':doautocmd does not warn "No matching autocommands" #10689', function() local screen = Screen.new(32, 3) screen:attach() |