diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-03-22 18:13:01 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-03-22 18:13:01 +0000 |
commit | 6f2465d336a9d4afe392db4084ef7e9db17e67c1 (patch) | |
tree | 3aaee0bf7b626607678be0c8835190a4ed695f24 | |
parent | e7dd0fa2c61fe71f12c72b0dcb7bb6415eb048fb (diff) | |
download | vim-git-6f2465d336a9d4afe392db4084ef7e9db17e67c1.tar.gz |
patch 8.2.4609: :unhide does not check for failing to close a windowv8.2.4609
Problem: :unhide does not check for failing to close a window.
Solution: When closing a window fails continue with the next one. Do not
try closing the autocmd window. (closes #9984)
-rw-r--r-- | src/buffer.c | 24 | ||||
-rw-r--r-- | src/proto/window.pro | 1 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 15 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/window.c | 3 |
5 files changed, 33 insertions, 12 deletions
diff --git a/src/buffer.c b/src/buffer.c index 8e68d9424..2dac4874c 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -5330,17 +5330,21 @@ ex_buffer_all(exarg_T *eap) { wpnext = wp->w_next; if ((wp->w_buffer->b_nwindows > 1 - || ((cmdmod.cmod_split & WSP_VERT) - ? wp->w_height + wp->w_status_height < Rows - p_ch - - tabline_height() - : wp->w_width != Columns) - || (had_tab > 0 && wp != firstwin)) && !ONE_WINDOW - && !(wp->w_closing || wp->w_buffer->b_locked > 0)) + || ((cmdmod.cmod_split & WSP_VERT) + ? wp->w_height + wp->w_status_height < Rows - p_ch + - tabline_height() + : wp->w_width != Columns) + || (had_tab > 0 && wp != firstwin)) + && !ONE_WINDOW + && !(wp->w_closing || wp->w_buffer->b_locked > 0) + && !win_unlisted(wp)) { - win_close(wp, FALSE); - wpnext = firstwin; // just in case an autocommand does - // something strange with windows - tpnext = first_tabpage; // start all over... + if (win_close(wp, FALSE) == FAIL) + break; + // Just in case an autocommand does something strange with + // windows: start all over... + wpnext = firstwin; + tpnext = first_tabpage; open_wins = 0; } else diff --git a/src/proto/window.pro b/src/proto/window.pro index 11c2d47c7..1954dfd0b 100644 --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -46,6 +46,7 @@ win_T *win_horz_neighbor(tabpage_T *tp, win_T *wp, int left, long count); void win_enter(win_T *wp, int undo_sync); win_T *buf_jump_open_win(buf_T *buf); win_T *buf_jump_open_tab(buf_T *buf); +int win_unlisted(win_T *wp); void win_free_popup(win_T *win); void win_remove(win_T *wp, tabpage_T *tp); int win_alloc_lines(win_T *wp); diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 7be0c1815..688508a85 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -3,6 +3,7 @@ source shared.vim source check.vim source term_util.vim +import './vim9.vim' as v9 func s:cleanup_buffers() abort for bnr in range(1, bufnr('$')) @@ -2975,4 +2976,18 @@ func Test_Changed_ChangedI() bw! endfunc +func Test_closing_autocmd_window() + let lines =<< trim END + edit Xa.txt + tabnew Xb.txt + autocmd BufEnter Xa.txt unhide 1 + doautoall BufEnter + END + call v9.CheckScriptFailure(lines, 'E814:') + au! BufEnter + only! + bwipe Xa.txt + bwipe Xb.txt +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 2180ebf26..cd3d9cdee 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4609, +/**/ 4608, /**/ 4607, diff --git a/src/window.c b/src/window.c index cf11acf89..435ad037a 100644 --- a/src/window.c +++ b/src/window.c @@ -43,7 +43,6 @@ static int frame_minheight(frame_T *topfrp, win_T *next_curwin); static int may_open_tabpage(void); static int win_enter_ext(win_T *wp, int flags); static void win_free(win_T *wp, tabpage_T *tp); -static int win_unlisted(win_T *wp); static void win_append(win_T *after, win_T *wp); static void frame_append(frame_T *after, frame_T *frp); static void frame_insert(frame_T *before, frame_T *frp); @@ -5233,7 +5232,7 @@ win_free( * Return TRUE if "wp" is not in the list of windows: the autocmd window or a * popup window. */ - static int + int win_unlisted(win_T *wp) { return wp == aucmd_win || WIN_IS_POPUP(wp); |