# HG changeset patch # User Bram Moolenaar # Date 1578945603 -3600 # Node ID 0b337617877ecc351396d1afc62e4bb093a3115b # Parent ca362df0be20018053ca32cc47ec30abb0c41f9e patch 8.2.0116: BufEnter autocmd not triggered on ":tab drop" Commit: https://github.com/vim/vim/commit/c10b521628f2b073fa231defa26f23937c91724d Author: Bram Moolenaar Date: Mon Jan 13 20:54:51 2020 +0100 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 https://github.com/vim/vim/issues/1660, closes #5473) diff --git a/src/arglist.c b/src/arglist.c --- a/src/arglist.c +++ b/src/arglist.c @@ -864,6 +864,7 @@ do_arg_all( // int opened_len; // length of opened[] int use_firstwin = FALSE; // use first window for arglist + int tab_drop_empty_window = FALSE; int split_ret = OK; int p_ea_save; alist_T *alist; // argument list to be used @@ -1027,13 +1028,16 @@ do_arg_all( last_curwin = curwin; last_curtab = curtab; 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. if (keep_tabs && BUFEMPTY() && curbuf->b_nwindows == 1 && curbuf->b_ffname == NULL && !curbuf->b_changed) + { 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) arg_had_last = TRUE; @@ -1067,6 +1071,9 @@ do_arg_all( } 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 { p_ea_save = p_ea; @@ -1091,6 +1098,8 @@ do_arg_all( ((buf_hide(curwin->w_buffer) || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0) + ECMD_OLDBUF, curwin); + if (tab_drop_empty_window && i == count - 1) + ++autocmd_no_enter; if (use_firstwin) ++autocmd_no_leave; use_firstwin = FALSE; diff --git a/src/testdir/test_tabpage.vim b/src/testdir/test_tabpage.vim --- a/src/testdir/test_tabpage.vim +++ b/src/testdir/test_tabpage.vim @@ -222,6 +222,34 @@ function Test_tabpage_with_autocmd() 1tabonly! 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() CheckFeature quickfix diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -743,6 +743,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 116, +/**/ 115, /**/ 114,