diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2017-03-21 10:39:24 +0100 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2017-03-22 18:42:56 +0100 |
commit | 10f6624f65edbc8af84c9775e6712484be9c81a5 (patch) | |
tree | dffba08c6705c23a363742ec07352280e4f64711 /src | |
parent | 4a2e6f460d02762d211c0f92af305ef5290a667b (diff) | |
download | rneovim-10f6624f65edbc8af84c9775e6712484be9c81a5.tar.gz rneovim-10f6624f65edbc8af84c9775e6712484be9c81a5.tar.bz2 rneovim-10f6624f65edbc8af84c9775e6712484be9c81a5.zip |
vim-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/buffer.c | 14 | ||||
-rw-r--r-- | src/nvim/testdir/test_autocmd.vim | 11 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
3 files changed, 26 insertions, 1 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 5edc87eab1..7429e8628e 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -337,6 +337,10 @@ void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last) bool del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE); bool wipe_buf = (action == DOBUF_WIPE); + bool is_curwin = (curwin != NULL && curwin->w_buffer == buf); + win_T *the_curwin = curwin; + tabpage_T *the_curtab = curtab; + // Force unloading or deleting when 'bufhidden' says so, but not for terminal // buffers. // The caller must take care of NOT deleting/freeing when 'bufhidden' is @@ -419,6 +423,16 @@ void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last) if (aborting()) /* autocmds may abort script processing */ return; } + + // 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(); + } + int nwindows = buf->b_nwindows; /* decrease the link count from windows (unless not in any window) */ diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim index b5d78c183f..a122a62561 100644 --- a/src/nvim/testdir/test_autocmd.vim +++ b/src/nvim/testdir/test_autocmd.vim @@ -98,6 +98,17 @@ function Test_autocmd_bufunload_with_tabnext() 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 + tabclose +endfunc + " SEGV occurs in older versions. (At least 7.4.2321 or older) function Test_autocmd_bufunload_avoiding_SEGV_01() split aa.txt diff --git a/src/nvim/version.c b/src/nvim/version.c index 84cb8fea9b..d1d3e5a3c9 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -113,7 +113,7 @@ static int included_patches[] = { 2331, // 2330, 2329, - // 2328, + 2328, // 2327 NA 2326, // 2325 NA |