From 8d72d1ceb4b23579963db2b977a0efbb3431c112 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sun, 16 Nov 2025 07:18:39 +0800 Subject: [PATCH] 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 https://github.com/vim/vim/commit/61b73b89a3114b4bf62ffbedc8d0d3aa321bdcd5 Co-authored-by: Christian Brabandt --- src/nvim/window.c | 12 ++++++++++-- test/old/testdir/test_autocmd.vim | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/nvim/window.c b/src/nvim/window.c index 8b7f99dba1..2b53c56a70 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -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; } diff --git a/test/old/testdir/test_autocmd.vim b/test/old/testdir/test_autocmd.vim index a663937415..91a1c2b59f 100644 --- a/test/old/testdir/test_autocmd.vim +++ b/test/old/testdir/test_autocmd.vim @@ -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