# HG changeset patch # User Bram Moolenaar # Date 1668863703 -3600 # Node ID bcda71c8977605ed2052a70008b571fa5fca9808 # Parent b2cd9ed7d829206d444012439b5bec12e66ef88c patch 9.0.0909: error message for layout change does not match action Commit: https://github.com/vim/vim/commit/9fda81515b26ecd3c1e99f95334aaed3f7b6fea3 Author: Bram Moolenaar Date: Sat Nov 19 13:14:10 2022 +0000 patch 9.0.0909: error message for layout change does not match action Problem: Error message for layout change does not match action. Solution: Pass the command to where the error is given. (closes https://github.com/vim/vim/issues/11573) diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -6055,7 +6055,7 @@ ex_win_close( emsg(_(e_cannot_close_autocmd_or_popup_window)); return; } - if (window_layout_locked()) + if (window_layout_locked(CMD_close)) return; need_hide = (bufIsChanged(buf) && buf->b_nwindows <= 1); @@ -6229,7 +6229,7 @@ ex_tabclose(exarg_T *eap) cmdwin_result = K_IGNORE; else if (first_tabpage->tp_next == NULL) emsg(_(e_cannot_close_last_tab_page)); - else if (!window_layout_locked()) + else if (!window_layout_locked(CMD_tabclose)) { tab_number = get_tabpage_arg(eap); if (eap->errmsg == NULL) @@ -6265,7 +6265,7 @@ ex_tabonly(exarg_T *eap) cmdwin_result = K_IGNORE; else if (first_tabpage->tp_next == NULL) msg(_("Already only one tab page")); - else if (!window_layout_locked()) + else if (!window_layout_locked(CMD_tabonly)) { tab_number = get_tabpage_arg(eap); if (eap->errmsg == NULL) @@ -6298,7 +6298,7 @@ ex_tabonly(exarg_T *eap) void tabpage_close(int forceit) { - if (window_layout_locked()) + if (window_layout_locked(CMD_tabclose)) return; // First close all the windows but the current one. If that worked then @@ -6346,7 +6346,7 @@ tabpage_close_other(tabpage_T *tp, int f static void ex_only(exarg_T *eap) { - if (window_layout_locked()) + if (window_layout_locked(CMD_only)) return; # ifdef FEAT_GUI need_mouse_correct = TRUE; @@ -6373,7 +6373,7 @@ ex_hide(exarg_T *eap UNUSED) // ":hide" or ":hide | cmd": hide current window if (!eap->skip) { - if (window_layout_locked()) + if (window_layout_locked(CMD_hide)) return; #ifdef FEAT_GUI need_mouse_correct = TRUE; diff --git a/src/proto/window.pro b/src/proto/window.pro --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -1,5 +1,5 @@ /* window.c */ -int window_layout_locked(void); +int window_layout_locked(enum CMD_index cmd); win_T *prevwin_curwin(void); void do_window(int nchar, long Prenum, int xchar); void get_wincmd_addr_type(char_u *arg, exarg_T *eap); diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -756,6 +756,14 @@ func Test_BufEnter() bwipe! au! BufEnter endfor + + new + new + autocmd BufEnter * ++once close + call assert_fails('close', 'E1312:') + + au! BufEnter + only endfunc " Closing a window might cause an endless loop diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 909, +/**/ 908, /**/ 907, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -111,13 +111,15 @@ window_layout_unlock(void) /* * When the window layout cannot be changed give an error and return TRUE. + * "cmd" indicates the action being performed and is used to pick the relevant + * error message. */ int -window_layout_locked(void) +window_layout_locked(enum CMD_index cmd) { if (split_disallowed > 0 || close_disallowed > 0) { - if (close_disallowed == 0) + if (close_disallowed == 0 && cmd == CMD_tabnew) emsg(_(e_cannot_split_window_when_closing_buffer)); else emsg(_(e_not_allowed_to_change_window_layout_in_this_autocmd)); @@ -2573,7 +2575,7 @@ win_close(win_T *win, int free_buf) emsg(_(e_cannot_close_last_window)); return FAIL; } - if (window_layout_locked()) + if (window_layout_locked(CMD_close)) return FAIL; if (win->w_closing || (win->w_buffer != NULL @@ -4062,7 +4064,7 @@ win_new_tabpage(int after) emsg(_(e_invalid_in_cmdline_window)); return FAIL; } - if (window_layout_locked()) + if (window_layout_locked(CMD_tabnew)) return FAIL; newtp = alloc_tabpage();