vim-patch:9.1.1916: WinEnter autocommand confuses Vim when closing tabpage (#36567)

Problem:  WinEnter autocommand may confuse Vim when closing tabpage
          (hokorobi)
Solution: Verify that curwin did not change in close_others()

fixes: vim/vim#18722
closes: vim/vim#18733

61b73b89a3

Co-authored-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq
2025-11-16 07:18:39 +08:00
committed by GitHub
parent c123b7245c
commit 8d72d1ceb4
2 changed files with 33 additions and 2 deletions

View File

@@ -4038,6 +4038,8 @@ static int frame_minwidth(frame_T *topfrp, win_T *next_curwin)
/// @param forceit always hide all other windows
void close_others(int message, int forceit)
{
win_T *const old_curwin = curwin;
if (curwin->w_floating) {
if (message && !autocmd_busy) {
emsg(e_floatonly);
@@ -4046,8 +4048,7 @@ void close_others(int message, int forceit)
}
if (one_window(firstwin, NULL) && !lastwin->w_floating) {
if (message
&& !autocmd_busy) {
if (message && !autocmd_busy) {
msg(_(m_onlyone), 0);
}
return;
@@ -4057,6 +4058,13 @@ void close_others(int message, int forceit)
win_T *nextwp;
for (win_T *wp = firstwin; win_valid(wp); wp = nextwp) {
nextwp = wp->w_next;
// autocommands messed this one up
if (old_curwin != curwin && win_valid(old_curwin)) {
curwin = old_curwin;
curbuf = curwin->w_buffer;
}
if (wp == curwin) { // don't close current window
continue;
}

View File

@@ -4603,4 +4603,27 @@ func Test_eventignore_subtract()
%bw!
endfunc
func Test_win_tabclose_autocmd()
defer CleanUpTestAuGroup()
new
augroup testing
au WinClosed * wincmd p
augroup END
tabnew
new
new
call assert_equal(2, tabpagenr('$'))
try
tabclose
catch
" should not happen
call assert_report("closing tabpage failed")
endtry
call assert_equal(1, tabpagenr('$'))
bw!
endfunc
" vim: shiftwidth=2 sts=2 expandtab