diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-03-27 09:19:56 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-03-27 10:01:35 +0800 |
commit | ae0a43ec23d9d902d2d9c446dda592873988ea50 (patch) | |
tree | b4367538dee666321835525be7c5634d26f8fea9 | |
parent | f4f18a983305d3cf8a6028333e9b99e86283032b (diff) | |
download | rneovim-ae0a43ec23d9d902d2d9c446dda592873988ea50.tar.gz rneovim-ae0a43ec23d9d902d2d9c446dda592873988ea50.tar.bz2 rneovim-ae0a43ec23d9d902d2d9c446dda592873988ea50.zip |
fix(tabpage): correct check for failure to close window
Avoid closing window 999 times.
-rw-r--r-- | src/nvim/ex_docmd.c | 2 | ||||
-rw-r--r-- | test/functional/editor/tabpage_spec.lua | 17 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 0dbc9d6b14..20325509c4 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -6839,7 +6839,7 @@ void tabpage_close_other(tabpage_T *tp, int forceit) // Autocommands may delete the tab page under our fingers and we may // fail to close a window with a modified buffer. - if (!valid_tabpage(tp) || tp->tp_firstwin == wp) { + if (!valid_tabpage(tp) || tp->tp_lastwin == wp) { break; } } diff --git a/test/functional/editor/tabpage_spec.lua b/test/functional/editor/tabpage_spec.lua index d1d6854b07..2494daf99b 100644 --- a/test/functional/editor/tabpage_spec.lua +++ b/test/functional/editor/tabpage_spec.lua @@ -3,8 +3,10 @@ local helpers = require('test.functional.helpers')(after_each) local clear = helpers.clear local command = helpers.command local eq = helpers.eq +local neq = helpers.neq local feed = helpers.feed local eval = helpers.eval +local exec = helpers.exec describe('tabpage', function() before_each(clear) @@ -34,5 +36,20 @@ describe('tabpage', function() eq(3, eval('tabpagenr()')) end) + + it('does not crash or loop 999 times if BufWipeout autocommand switches window #17868', function() + exec([[ + tabedit + let s:window_id = win_getid() + botright new + setlocal bufhidden=wipe + let g:win_closed = 0 + autocmd WinClosed * let g:win_closed += 1 + autocmd BufWipeout <buffer> call win_gotoid(s:window_id) + tabprevious + +tabclose + ]]) + neq(999, eval('g:win_closed')) + end) end) |