changeset 10114:aa2219afd1c2 v7.4.2328

commit https://github.com/vim/vim/commit/f9e687e0681a250e1549ab27b6c7ef2c500395e3 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Sep 4 21:33:09 2016 +0200 patch 7.4.2328 Problem: Crash when BufWinLeave autocmd goes to another tab page. (Hirohito Higashi) Solution: Make close_buffer() go back to the right window.
author Christian Brabandt <cb@256bit.org>
date Sun, 04 Sep 2016 21:45:06 +0200
parents 5c59df6e1835
children d44279295365
files src/buffer.c src/testdir/test_autocmd.vim src/version.c
diffstat 3 files changed, 30 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -450,6 +450,11 @@ close_buffer(
     int		is_curbuf;
     int		nwindows;
     bufref_T	bufref;
+# ifdef FEAT_WINDOWS
+    int		is_curwin = (curwin!= NULL && curwin->w_buffer == buf);
+    win_T	*the_curwin = curwin;
+    tabpage_T	*the_curtab = curtab;
+# endif
 #endif
     int		unload_buf = (action != 0);
     int		del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE);
@@ -544,6 +549,19 @@ aucmd_abort:
 	    return;
 # endif
     }
+
+# ifdef FEAT_WINDOWS
+    /* If the buffer was in curwin and the window has changed, go back to that
+     * window, if it still exists.  This avoids that ":edit x" triggering a
+     * "tabnext" BufUnload autocmd leaves a window behind without a buffer. */
+    if (is_curwin && curwin != the_curwin &&  win_valid_any_tab(the_curwin))
+    {
+	block_autocmds();
+	goto_tabpage_win(the_curtab, the_curwin);
+	unblock_autocmds();
+    }
+# endif
+
     nwindows = buf->b_nwindows;
 #endif
 
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -83,6 +83,16 @@ function Test_autocmd_bufunload_with_tab
   quit
 endfunc
 
+function Test_autocmd_bufwinleave_with_tabfirst()
+  tabedit
+  augroup sample
+    autocmd!
+    autocmd BufWinLeave <buffer> tabfirst
+  augroup END
+  call setline(1, ['a', 'b', 'c'])
+  edit! a.txt
+endfunc
+
 " SEGV occurs in older versions.  (At least 7.4.2321 or older)
 function Test_autocmd_bufunload_avoiding_SEGV_01()
   split aa.txt
--- a/src/version.c
+++ b/src/version.c
@@ -764,6 +764,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2328,
+/**/
     2327,
 /**/
     2326,