# HG changeset patch # User Bram Moolenaar # Date 1593193507 -7200 # Node ID 0738c44504cb1dd070a4c834c5df4affbe845287 # Parent ab6fe3bdc65ee01e486412347d97ea01bf63c999 patch 8.2.1059: crash when using :tabonly in an autocommand Commit: https://github.com/vim/vim/commit/cf8441704d6e517bda1899f4afa82c6b4eecbaec Author: Bram Moolenaar Date: Fri Jun 26 19:44:06 2020 +0200 patch 8.2.1059: crash when using :tabonly in an autocommand Problem: Crash when using :tabonly in an autocommand. (Yegappan Lakshmanan) Solution: Do not allow the autocommand window to be closed. diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- 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 --- a/src/globals.h +++ b/src/globals.h @@ -1765,6 +1765,7 @@ EXTERN char e_float_as_string[] INIT(= N #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 --- 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 --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1059, +/**/ 1058, /**/ 1057, diff --git a/src/window.c b/src/window.c --- 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())