changeset 9599:42a8a81decdf v7.4.2077

commit https://github.com/vim/vim/commit/12c11d553053f5a9eae9eb3c518279b12fa928c2 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jul 19 23:13:03 2016 +0200 patch 7.4.2077 Problem: Cannot update 'tabline' when a tab was closed. Solution: Add the TabClosed autocmd event. (partly by Felipe Morales)
author Christian Brabandt <cb@256bit.org>
date Tue, 19 Jul 2016 23:15:06 +0200
parents dd6f3e98646b
children 8ab52b4db723
files runtime/doc/autocmd.txt src/fileio.c src/testdir/test_autocmd.vim src/version.c src/vim.h src/window.c
diffstat 6 files changed, 36 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -1,4 +1,4 @@
-*autocmd.txt*   For Vim version 7.4.  Last change: 2016 Jun 09
+*autocmd.txt*   For Vim version 7.4.  Last change: 2016 Jul 19
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -294,7 +294,8 @@ Name			triggered by ~
 |CursorMovedI|		the cursor was moved in Insert mode
 
 |WinNew|		after creating a new window
-|TabNew|		after creating a new window
+|TabNew|		after creating a new tab page
+|TabClosed|		after closing a tab page
 |WinEnter|		after entering another window
 |WinLeave|		before leaving a window
 |TabEnter|		after entering another tab page
@@ -311,9 +312,6 @@ Name			triggered by ~
 |TextChanged|		after a change was made to the text in Normal mode
 |TextChangedI|		after a change was made to the text in Insert mode
 
-|TextChanged|		after a change was made to the text in Normal mode
-|TextChangedI|		after a change was made to the text in Insert mode
-
 |ColorScheme|		after loading a color scheme
 
 |RemoteReply|		a reply from a server Vim was received
@@ -879,6 +877,8 @@ Syntax				When the 'syntax' option has b
 				where this option was set, and <amatch> for
 				the new value of 'syntax'.
 				See |:syn-on|.
+							*TabClosed*
+TabClosed			After closing a tab page.
 							*TabEnter*
 TabEnter			Just after entering a tab page. |tab-page|
 				After triggering the WinEnter and before
@@ -976,6 +976,11 @@ WinLeave			Before leaving a window.  If 
 				WinLeave autocommands (but not for ":new").
 				Not used for ":qa" or ":q" when exiting Vim.
 
+							*WinNew*
+WinNew				When a new window was created.  Not done for
+				the fist window, when Vim has just started.
+				Before a WinEnter event.
+
 ==============================================================================
 6. Patterns					*autocmd-patterns* *{pat}*
 
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -7707,6 +7707,7 @@ static struct event_name
     {"SwapExists",	EVENT_SWAPEXISTS},
     {"Syntax",		EVENT_SYNTAX},
     {"TabNew",		EVENT_TABNEW},
+    {"TabClosed",	EVENT_TABCLOSED},
     {"TabEnter",	EVENT_TABENTER},
     {"TabLeave",	EVENT_TABLEAVE},
     {"TermChanged",	EVENT_TERMCHANGED},
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -87,6 +87,7 @@ func Test_win_tab_autocmd()
     au WinEnter * call add(g:record, 'WinEnter') 
     au WinLeave * call add(g:record, 'WinLeave') 
     au TabNew * call add(g:record, 'TabNew')
+    au TabClosed * call add(g:record, 'TabClosed')
     au TabEnter * call add(g:record, 'TabEnter')
     au TabLeave * call add(g:record, 'TabLeave')
   augroup END
@@ -99,8 +100,19 @@ func Test_win_tab_autocmd()
   call assert_equal([
 	\ 'WinLeave', 'WinNew', 'WinEnter',
 	\ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
+	\ 'WinLeave', 'TabLeave', 'TabClosed', 'WinEnter', 'TabEnter',
+	\ 'WinLeave', 'WinEnter'
+	\ ], g:record)
+
+  let g:record = []
+  tabnew somefile
+  tabnext
+  bwipe somefile
+
+  call assert_equal([
+	\ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
 	\ 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter',
-	\ 'WinLeave', 'WinEnter'
+	\ 'TabClosed'
 	\ ], g:record)
 
   augroup testing
--- a/src/version.c
+++ b/src/version.c
@@ -759,6 +759,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2077,
+/**/
     2076,
 /**/
     2075,
--- a/src/vim.h
+++ b/src/vim.h
@@ -1331,6 +1331,7 @@ enum auto_event
     EVENT_TABENTER,		/* after entering a tab page */
     EVENT_TABLEAVE,		/* before leaving a tab page */
     EVENT_TABNEW,		/* when entering a new tab page */
+    EVENT_TABCLOSED,		/* after closing a tab page */
     EVENT_SHELLCMDPOST,		/* after ":!cmd" */
     EVENT_SHELLFILTERPOST,	/* after ":1,2!cmd", ":w !cmd", ":r !cmd". */
     EVENT_TEXTCHANGED,		/* text was modified */
--- a/src/window.c
+++ b/src/window.c
@@ -2095,6 +2095,9 @@ close_windows(
     win_T	*wp;
     tabpage_T   *tp, *nexttp;
     int		h = tabline_height();
+#ifdef FEAT_AUTOCMD
+    int		count = tabpage_index(NULL);
+#endif
 
     ++RedrawingDisabled;
 
@@ -2138,6 +2141,11 @@ close_windows(
 
     --RedrawingDisabled;
 
+#ifdef FEAT_AUTOCMD
+    if (count != tabpage_index(NULL))
+	apply_autocmds(EVENT_TABCLOSED, NULL, NULL, FALSE, curbuf);
+#endif
+
     redraw_tabline = TRUE;
     if (h != tabline_height())
 	shell_new_rows();
@@ -2220,6 +2228,7 @@ close_last_window_tabpage(
 	/* Since goto_tabpage_tp above did not trigger *Enter autocommands, do
 	 * that now. */
 #ifdef FEAT_AUTOCMD
+	apply_autocmds(EVENT_TABCLOSED, NULL, NULL, FALSE, curbuf);
 	apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf);
 	apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
 	if (old_curbuf != curbuf)