summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-03-22 18:13:01 +0000
committerBram Moolenaar <Bram@vim.org>2022-03-22 18:13:01 +0000
commit6f2465d336a9d4afe392db4084ef7e9db17e67c1 (patch)
tree3aaee0bf7b626607678be0c8835190a4ed695f24 /src
parente7dd0fa2c61fe71f12c72b0dcb7bb6415eb048fb (diff)
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)
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c24
-rw-r--r--src/proto/window.pro1
-rw-r--r--src/testdir/test_autocmd.vim15
-rw-r--r--src/version.c2
-rw-r--r--src/window.c3
5 files changed, 33 insertions, 12 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 8e68d94248..2dac4874c5 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 11c2d47c70..1954dfd0ba 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 7be0c1815a..688508a856 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 2180ebf264..cd3d9cdeed 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 cf11acf893..435ad037ac 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);