diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 6c887fae1c..2469df341c 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -5178,6 +5178,13 @@ ex_win_close( int need_hide; buf_T *buf = win->w_buffer; + // Never close the autocommand window. + if (win == aucmd_win) + { + emsg(_(e_autocmd_close)); + return; + } + need_hide = (bufIsChanged(buf) && buf->b_nwindows <= 1); if (need_hide && !buf_hide(buf) && !forceit) { diff --git a/src/globals.h b/src/globals.h index c7f9794ab9..03a6937561 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1765,6 +1765,7 @@ EXTERN char e_float_as_string[] INIT(= N_("E806: using Float as a String")); #endif EXTERN char e_dirnotf[] INIT(= N_("E919: Directory not found in '%s': \"%s\"")); EXTERN char e_au_recursive[] INIT(= N_("E952: Autocommand caused recursive behavior")); +EXTERN char e_autocmd_close[] INIT(= N_("E813: Cannot close autocmd or popup window")); #ifdef FEAT_MENU EXTERN char e_menuothermode[] INIT(= N_("E328: Menu only exists in another mode")); #endif diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index d7328c3e0a..446d22bd71 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -2617,7 +2617,27 @@ func Test_close_autocmd_window() au! augroup END augroup! aucmd_win_test2 - %bw! + %bwipe! +endfunc + +" Test for trying to close the tab that has the temporary window for exeucing +" an autocmd. +func Test_close_autocmd_tab() + edit one.txt + tabnew two.txt + augroup aucmd_win_test + au! + au BufEnter * if expand('') == 'one.txt' | tabfirst | tabonly | endif + augroup END + + call assert_fails('doautoall BufEnter', 'E813:') + + tabonly + augroup aucmd_win_test + au! + augroup END + augroup! aucmd_win_test + %bwipe! endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index de8807a528..aff4583e94 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1059, /**/ 1058, /**/ diff --git a/src/window.c b/src/window.c index 095eabed2b..e2adc0cb9f 100644 --- a/src/window.c +++ b/src/window.c @@ -2461,7 +2461,7 @@ win_close(win_T *win, int free_buf) return FAIL; // window is already being closed if (win_unlisted(win)) { - emsg(_("E813: Cannot close autocmd or popup window")); + emsg(_(e_autocmd_close)); return FAIL; } if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window())