mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	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.
			
			
This commit is contained in:
		| @@ -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) */ | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -113,7 +113,7 @@ static int included_patches[] = { | ||||
|   2331, | ||||
|   // 2330, | ||||
|   2329, | ||||
|   // 2328, | ||||
|   2328, | ||||
|   // 2327 NA | ||||
|   2326, | ||||
|   // 2325 NA | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Justin M. Keyes
					Justin M. Keyes