1
0
forked from aniani/vim

patch 8.2.0116: BufEnter autocmd not triggered on ":tab drop"

Problem:    BufEnter autocmd not triggered on ":tab drop". (Andy Stewart)
Solution:   Decrement autocmd_no_enter for the last file. (closes #1660,
            closes #5473)
This commit is contained in:
Bram Moolenaar
2020-01-13 20:54:51 +01:00
parent 9df53b62de
commit c10b521628
3 changed files with 41 additions and 2 deletions

View File

@@ -864,6 +864,7 @@ do_arg_all(
// //
int opened_len; // length of opened[] int opened_len; // length of opened[]
int use_firstwin = FALSE; // use first window for arglist int use_firstwin = FALSE; // use first window for arglist
int tab_drop_empty_window = FALSE;
int split_ret = OK; int split_ret = OK;
int p_ea_save; int p_ea_save;
alist_T *alist; // argument list to be used alist_T *alist; // argument list to be used
@@ -1027,13 +1028,16 @@ do_arg_all(
last_curwin = curwin; last_curwin = curwin;
last_curtab = curtab; last_curtab = curtab;
win_enter(lastwin, FALSE); win_enter(lastwin, FALSE);
// ":drop all" should re-use an empty window to avoid "--remote-tab" // ":tab drop file" should re-use an empty window to avoid "--remote-tab"
// leaving an empty tab page when executed locally. // leaving an empty tab page when executed locally.
if (keep_tabs && BUFEMPTY() && curbuf->b_nwindows == 1 if (keep_tabs && BUFEMPTY() && curbuf->b_nwindows == 1
&& curbuf->b_ffname == NULL && !curbuf->b_changed) && curbuf->b_ffname == NULL && !curbuf->b_changed)
{
use_firstwin = TRUE; use_firstwin = TRUE;
tab_drop_empty_window = TRUE;
}
for (i = 0; i < count && i < opened_len && !got_int; ++i) for (i = 0; i < count && !got_int; ++i)
{ {
if (alist == &global_alist && i == global_alist.al_ga.ga_len - 1) if (alist == &global_alist && i == global_alist.al_ga.ga_len - 1)
arg_had_last = TRUE; arg_had_last = TRUE;
@@ -1067,6 +1071,9 @@ do_arg_all(
} }
else if (split_ret == OK) else if (split_ret == OK)
{ {
// trigger events for tab drop
if (tab_drop_empty_window && i == count - 1)
--autocmd_no_enter;
if (!use_firstwin) // split current window if (!use_firstwin) // split current window
{ {
p_ea_save = p_ea; p_ea_save = p_ea;
@@ -1091,6 +1098,8 @@ do_arg_all(
((buf_hide(curwin->w_buffer) ((buf_hide(curwin->w_buffer)
|| bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0) || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0)
+ ECMD_OLDBUF, curwin); + ECMD_OLDBUF, curwin);
if (tab_drop_empty_window && i == count - 1)
++autocmd_no_enter;
if (use_firstwin) if (use_firstwin)
++autocmd_no_leave; ++autocmd_no_leave;
use_firstwin = FALSE; use_firstwin = FALSE;

View File

@@ -222,6 +222,34 @@ function Test_tabpage_with_autocmd()
1tabonly! 1tabonly!
endfunction endfunction
" Test autocommands on tab drop
function Test_tabpage_with_autocmd_tab_drop()
augroup TestTabpageGroup
au!
autocmd TabEnter * call add(s:li, 'TabEnter')
autocmd WinEnter * call add(s:li, 'WinEnter')
autocmd BufEnter * call add(s:li, 'BufEnter')
autocmd TabLeave * call add(s:li, 'TabLeave')
autocmd WinLeave * call add(s:li, 'WinLeave')
autocmd BufLeave * call add(s:li, 'BufLeave')
augroup END
let s:li = []
tab drop test1
call assert_equal(['BufLeave', 'BufEnter'], s:li)
let s:li = []
tab drop test2 test3
call assert_equal([
\ 'TabLeave', 'TabEnter', 'TabLeave', 'TabEnter',
\ 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter',
\ 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'], s:li)
autocmd! TestTabpageGroup
augroup! TestTabpageGroup
1tabonly!
endfunction
function Test_tabpage_with_tab_modifier() function Test_tabpage_with_tab_modifier()
CheckFeature quickfix CheckFeature quickfix

View File

@@ -742,6 +742,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
116,
/**/ /**/
115, 115,
/**/ /**/