diff options
-rw-r--r-- | src/ex_docmd.c | 12 | ||||
-rw-r--r-- | src/proto/window.pro | 2 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 8 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/window.c | 10 |
5 files changed, 23 insertions, 11 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c index ac4012725b..bb4a831633 100644 --- 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 forceit) 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 index 70d6b06ef5..5316f95a61 100644 --- 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 index f2f3725b3d..637fdb8c8e 100644 --- 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 index f6640c34d8..b642be97e5 100644 --- 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 index a64a52e801..422f4fabae 100644 --- 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(); |