Mercurial > vim
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