Problem: Cannot update 'tabline' when a tab was closed.
Solution: Add the TabClosed autocmd event. (partly by Felipe Morales)
-*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
|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
|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
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
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}*
{"SwapExists", EVENT_SWAPEXISTS},
{"Syntax", EVENT_SYNTAX},
{"TabNew", EVENT_TABNEW},
+ {"TabClosed", EVENT_TABCLOSED},
{"TabEnter", EVENT_TABENTER},
{"TabLeave", EVENT_TABLEAVE},
{"TermChanged", EVENT_TERMCHANGED},
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
call assert_equal([
\ 'WinLeave', 'WinNew', 'WinEnter',
\ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
- \ 'WinLeave', 'TabLeave', 'WinEnter', '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',
+ \ 'TabClosed'
+ \ ], g:record)
+
augroup testing
au!
augroup END
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 2077,
/**/
2076,
/**/
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 */
win_T *wp;
tabpage_T *tp, *nexttp;
int h = tabline_height();
+#ifdef FEAT_AUTOCMD
+ int count = tabpage_index(NULL);
+#endif
++RedrawingDisabled;
--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();
/* 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)