| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.926 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.926 |
| Problem: Autocommands are triggered by setwinvar() et al. Missing BufEnter |
| on :tabclose. Duplicate WinEnter on :tabclose. Wrong order of |
| events for :tablose and :tabnew. |
| Solution: Fix these autocommand events. (Zyx) |
| Files: runtime/doc/eval.txt, src/buffer.c, src/eval.c, src/ex_cmds2.c, |
| src/fileio.c, src/proto/window.pro, src/testdir/test62.in, |
| src/testdir/test62.ok, src/window.c |
| |
| |
| |
| |
| |
| *** 5294,5301 **** |
| |t:var| |
| Note that the variable name without "t:" must be used. |
| Tabs are numbered starting with one. |
| - Vim briefly goes to the tab page {tabnr}, this may trigger |
| - TabLeave and TabEnter autocommands. |
| This function is not available in the |sandbox|. |
| |
| settabwinvar({tabnr}, {winnr}, {varname}, {val}) *settabwinvar()* |
| --- 5320,5325 ---- |
| |
| *** 5308,5315 **** |
| doesn't work for a global or local buffer variable. |
| For a local buffer option the global value is unchanged. |
| Note that the variable name without "w:" must be used. |
| - Vim briefly goes to the tab page {tabnr}, this may trigger |
| - TabLeave and TabEnter autocommands. |
| Examples: > |
| :call settabwinvar(1, 1, "&list", 0) |
| :call settabwinvar(3, 2, "myvar", "foobar") |
| --- 5332,5337 ---- |
| |
| |
| |
| *** 4551,4557 **** |
| * When the ":tab" modifier was used do this for all tab pages. |
| */ |
| if (had_tab > 0) |
| ! goto_tabpage_tp(first_tabpage, TRUE); |
| for (;;) |
| { |
| tpnext = curtab->tp_next; |
| --- 4551,4557 ---- |
| * When the ":tab" modifier was used do this for all tab pages. |
| */ |
| if (had_tab > 0) |
| ! goto_tabpage_tp(first_tabpage, TRUE, TRUE); |
| for (;;) |
| { |
| tpnext = curtab->tp_next; |
| |
| *** 4663,4669 **** |
| if (!valid_tabpage(tpnext)) |
| tpnext = first_tabpage; /* start all over...*/ |
| # endif |
| ! goto_tabpage_tp(tpnext, TRUE); |
| } |
| |
| /* |
| --- 4663,4669 ---- |
| if (!valid_tabpage(tpnext)) |
| tpnext = first_tabpage; /* start all over...*/ |
| # endif |
| ! goto_tabpage_tp(tpnext, TRUE, TRUE); |
| } |
| |
| /* |
| |
| *** 4767,4779 **** |
| if (last_curtab != new_curtab) |
| { |
| if (valid_tabpage(last_curtab)) |
| ! goto_tabpage_tp(last_curtab, TRUE); |
| if (win_valid(last_curwin)) |
| win_enter(last_curwin, FALSE); |
| } |
| /* to window with first arg */ |
| if (valid_tabpage(new_curtab)) |
| ! goto_tabpage_tp(new_curtab, TRUE); |
| if (win_valid(new_curwin)) |
| win_enter(new_curwin, FALSE); |
| |
| --- 4767,4779 ---- |
| if (last_curtab != new_curtab) |
| { |
| if (valid_tabpage(last_curtab)) |
| ! goto_tabpage_tp(last_curtab, TRUE, TRUE); |
| if (win_valid(last_curwin)) |
| win_enter(last_curwin, FALSE); |
| } |
| /* to window with first arg */ |
| if (valid_tabpage(new_curtab)) |
| ! goto_tabpage_tp(new_curtab, TRUE, TRUE); |
| if (win_valid(new_curwin)) |
| win_enter(new_curwin, FALSE); |
| |
| |
| *** 4825,4831 **** |
| */ |
| #ifdef FEAT_WINDOWS |
| if (had_tab > 0) |
| ! goto_tabpage_tp(first_tabpage, TRUE); |
| for (;;) |
| { |
| #endif |
| --- 4825,4831 ---- |
| */ |
| #ifdef FEAT_WINDOWS |
| if (had_tab > 0) |
| ! goto_tabpage_tp(first_tabpage, TRUE, TRUE); |
| for (;;) |
| { |
| #endif |
| |
| *** 4865,4871 **** |
| /* Without the ":tab" modifier only do the current tab page. */ |
| if (had_tab == 0 || tpnext == NULL) |
| break; |
| ! goto_tabpage_tp(tpnext, TRUE); |
| } |
| #endif |
| |
| --- 4865,4871 ---- |
| /* Without the ":tab" modifier only do the current tab page. */ |
| if (had_tab == 0 || tpnext == NULL) |
| break; |
| ! goto_tabpage_tp(tpnext, TRUE, TRUE); |
| } |
| #endif |
| |
| |
| |
| |
| *** 16604,16610 **** |
| if (tp != NULL && varname != NULL && varp != NULL) |
| { |
| save_curtab = curtab; |
| ! goto_tabpage_tp(tp, TRUE); |
| |
| tabvarname = alloc((unsigned)STRLEN(varname) + 3); |
| if (tabvarname != NULL) |
| --- 16604,16610 ---- |
| if (tp != NULL && varname != NULL && varp != NULL) |
| { |
| save_curtab = curtab; |
| ! goto_tabpage_tp(tp, FALSE, FALSE); |
| |
| tabvarname = alloc((unsigned)STRLEN(varname) + 3); |
| if (tabvarname != NULL) |
| |
| *** 16617,16623 **** |
| |
| /* Restore current tabpage */ |
| if (valid_tabpage(save_curtab)) |
| ! goto_tabpage_tp(save_curtab, TRUE); |
| } |
| } |
| |
| --- 16617,16623 ---- |
| |
| /* Restore current tabpage */ |
| if (valid_tabpage(save_curtab)) |
| ! goto_tabpage_tp(save_curtab, FALSE, FALSE); |
| } |
| } |
| |
| |
| *** 16654,16660 **** |
| /* set curwin to be our win, temporarily */ |
| *save_curwin = curwin; |
| *save_curtab = curtab; |
| ! goto_tabpage_tp(tp, TRUE); |
| if (!win_valid(win)) |
| return FAIL; |
| curwin = win; |
| --- 16654,16660 ---- |
| /* set curwin to be our win, temporarily */ |
| *save_curwin = curwin; |
| *save_curtab = curtab; |
| ! goto_tabpage_tp(tp, FALSE, FALSE); |
| if (!win_valid(win)) |
| return FAIL; |
| curwin = win; |
| |
| *** 16672,16678 **** |
| /* Restore current tabpage and window, if still valid (autocommands can |
| * make them invalid). */ |
| if (valid_tabpage(save_curtab)) |
| ! goto_tabpage_tp(save_curtab, TRUE); |
| if (win_valid(save_curwin)) |
| { |
| curwin = save_curwin; |
| --- 16672,16678 ---- |
| /* Restore current tabpage and window, if still valid (autocommands can |
| * make them invalid). */ |
| if (valid_tabpage(save_curtab)) |
| ! goto_tabpage_tp(save_curtab, FALSE, FALSE); |
| if (win_valid(save_curwin)) |
| { |
| curwin = save_curwin; |
| |
| |
| |
| *** 2482,2488 **** |
| /* go to window "tp" */ |
| if (!valid_tabpage(tp)) |
| break; |
| ! goto_tabpage_tp(tp, TRUE); |
| tp = tp->tp_next; |
| } |
| #endif |
| --- 2482,2488 ---- |
| /* go to window "tp" */ |
| if (!valid_tabpage(tp)) |
| break; |
| ! goto_tabpage_tp(tp, TRUE, TRUE); |
| tp = tp->tp_next; |
| } |
| #endif |
| |
| |
| |
| *** 8934,8940 **** |
| if (wp == aucmd_win) |
| { |
| if (tp != curtab) |
| ! goto_tabpage_tp(tp, TRUE); |
| win_goto(aucmd_win); |
| goto win_found; |
| } |
| --- 8934,8940 ---- |
| if (wp == aucmd_win) |
| { |
| if (tp != curtab) |
| ! goto_tabpage_tp(tp, TRUE, TRUE); |
| win_goto(aucmd_win); |
| goto win_found; |
| } |
| |
| |
| |
| *** 27,33 **** |
| tabpage_T *find_tabpage __ARGS((int n)); |
| int tabpage_index __ARGS((tabpage_T *ftp)); |
| void goto_tabpage __ARGS((int n)); |
| ! void goto_tabpage_tp __ARGS((tabpage_T *tp, int trigger_autocmds)); |
| void goto_tabpage_win __ARGS((tabpage_T *tp, win_T *wp)); |
| void tabpage_move __ARGS((int nr)); |
| void win_goto __ARGS((win_T *wp)); |
| --- 27,33 ---- |
| tabpage_T *find_tabpage __ARGS((int n)); |
| int tabpage_index __ARGS((tabpage_T *ftp)); |
| void goto_tabpage __ARGS((int n)); |
| ! void goto_tabpage_tp __ARGS((tabpage_T *tp, int trigger_enter_autocmds, int trigger_leave_autocmds)); |
| void goto_tabpage_win __ARGS((tabpage_T *tp, win_T *wp)); |
| void tabpage_move __ARGS((int nr)); |
| void win_goto __ARGS((win_T *wp)); |
| |
| |
| |
| *** 120,125 **** |
| --- 120,187 ---- |
| :endtry |
| i=a |
| |
| :" |
| + :" Test autocommands |
| + :tabonly! |
| + :let g:r=[] |
| + :command -nargs=1 -bar C :call add(g:r, '=== ' . <q-args> . ' ===')|<args> |
| + :function Test() |
| + let hasau=has('autocmd') |
| + if hasau |
| + autocmd TabEnter * :call add(g:r, 'TabEnter') |
| + autocmd WinEnter * :call add(g:r, 'WinEnter') |
| + autocmd BufEnter * :call add(g:r, 'BufEnter') |
| + autocmd TabLeave * :call add(g:r, 'TabLeave') |
| + autocmd WinLeave * :call add(g:r, 'WinLeave') |
| + autocmd BufLeave * :call add(g:r, 'BufLeave') |
| + endif |
| + let t:a='a' |
| + C tab split |
| + if !hasau |
| + let g:r+=['WinLeave', 'TabLeave', 'WinEnter', 'TabEnter'] |
| + endif |
| + let t:a='b' |
| + C tabnew |
| + if !hasau |
| + let g:r+=['WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufLeave', 'BufEnter'] |
| + endif |
| + let t:a='c' |
| + call add(g:r, join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")'))) |
| + C call map(range(1, tabpagenr('$')), 'settabvar(v:val, "a", v:val*2)') |
| + call add(g:r, join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")'))) |
| + let w:a='a' |
| + C vsplit |
| + if !hasau |
| + let g:r+=['WinLeave', 'WinEnter'] |
| + endif |
| + let w:a='a' |
| + let tabn=tabpagenr() |
| + let winr=range(1, winnr('$')) |
| + C tabnext 1 |
| + if !hasau |
| + let g:r+=['BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'] |
| + endif |
| + call add(g:r, join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")'))) |
| + C call map(copy(winr), 'settabwinvar('.tabn.', v:val, "a", v:val*2)') |
| + call add(g:r, join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")'))) |
| + if hasau |
| + augroup TabDestructive |
| + autocmd TabEnter * :C tabnext 2 | C tabclose 3 |
| + augroup END |
| + C tabnext 3 |
| + let g:r+=[tabpagenr().'/'.tabpagenr('$')] |
| + autocmd! TabDestructive TabEnter |
| + C tabnew |
| + C tabnext 1 |
| + autocmd TabDestructive TabEnter * nested :C tabnext 2 | C tabclose 3 |
| + C tabnext 3 |
| + let g:r+=[tabpagenr().'/'.tabpagenr('$')] |
| + else |
| + let g:r+=["=== tabnext 3 ===","BufLeave","WinLeave","TabLeave","WinEnter","TabEnter","=== tabnext 2 ===","=== tabclose 3 ===","2/2","=== tabnew ===","WinLeave","TabLeave","WinEnter","TabEnter","BufLeave","BufEnter","=== tabnext 1 ===","BufLeave","WinLeave","TabLeave","WinEnter","TabEnter","BufEnter","=== tabnext 3 ===","BufLeave","WinLeave","TabLeave","WinEnter","TabEnter","=== tabnext 2 ===","BufLeave","WinLeave","TabLeave","WinEnter","TabEnter","=== tabnext 2 ===","=== tabclose 3 ===","BufEnter","=== tabclose 3 ===","2/2",] |
| + endif |
| + endfunction |
| + :call Test() |
| + :$ put =g:r |
| + :" |
| :" |
| :/^Results/,$w! test.out |
| :qa! |
| |
| |
| |
| *** 18,20 **** |
| --- 18,88 ---- |
| 4 |
| 6 |
| E474 caught. |
| + === tab split === |
| + WinLeave |
| + TabLeave |
| + WinEnter |
| + TabEnter |
| + === tabnew === |
| + WinLeave |
| + TabLeave |
| + WinEnter |
| + TabEnter |
| + BufLeave |
| + BufEnter |
| + a b c |
| + === call map(range(1, tabpagenr('$')), 'settabvar(v:val, === |
| + a b c |
| + === vsplit === |
| + WinLeave |
| + WinEnter |
| + === tabnext 1 === |
| + BufLeave |
| + WinLeave |
| + TabLeave |
| + WinEnter |
| + TabEnter |
| + BufEnter |
| + a a |
| + === call map(copy(winr), 'settabwinvar('.tabn.', v:val, === |
| + a a |
| + === tabnext 3 === |
| + BufLeave |
| + WinLeave |
| + TabLeave |
| + WinEnter |
| + TabEnter |
| + === tabnext 2 === |
| + === tabclose 3 === |
| + 2/2 |
| + === tabnew === |
| + WinLeave |
| + TabLeave |
| + WinEnter |
| + TabEnter |
| + BufLeave |
| + BufEnter |
| + === tabnext 1 === |
| + BufLeave |
| + WinLeave |
| + TabLeave |
| + WinEnter |
| + TabEnter |
| + BufEnter |
| + === tabnext 3 === |
| + BufLeave |
| + WinLeave |
| + TabLeave |
| + WinEnter |
| + TabEnter |
| + === tabnext 2 === |
| + BufLeave |
| + WinLeave |
| + TabLeave |
| + WinEnter |
| + TabEnter |
| + === tabnext 2 === |
| + === tabclose 3 === |
| + BufEnter |
| + === tabclose 3 === |
| + 2/2 |
| |
| |
| |
| *** 44,54 **** |
| static void new_frame __ARGS((win_T *wp)); |
| #if defined(FEAT_WINDOWS) || defined(PROTO) |
| static tabpage_T *alloc_tabpage __ARGS((void)); |
| ! static int leave_tabpage __ARGS((buf_T *new_curbuf)); |
| ! static void enter_tabpage __ARGS((tabpage_T *tp, buf_T *old_curbuf, int trigger_autocmds)); |
| static void frame_fix_height __ARGS((win_T *wp)); |
| static int frame_minheight __ARGS((frame_T *topfrp, win_T *next_curwin)); |
| ! static void win_enter_ext __ARGS((win_T *wp, int undo_sync, int no_curwin)); |
| static void win_free __ARGS((win_T *wp, tabpage_T *tp)); |
| static void frame_append __ARGS((frame_T *after, frame_T *frp)); |
| static void frame_insert __ARGS((frame_T *before, frame_T *frp)); |
| --- 44,54 ---- |
| static void new_frame __ARGS((win_T *wp)); |
| #if defined(FEAT_WINDOWS) || defined(PROTO) |
| static tabpage_T *alloc_tabpage __ARGS((void)); |
| ! static int leave_tabpage __ARGS((buf_T *new_curbuf, int trigger_leave_autocmds)); |
| ! static void enter_tabpage __ARGS((tabpage_T *tp, buf_T *old_curbuf, int trigger_enter_autocmds, int trigger_leave_autocmds)); |
| static void frame_fix_height __ARGS((win_T *wp)); |
| static int frame_minheight __ARGS((frame_T *topfrp, win_T *next_curwin)); |
| ! static void win_enter_ext __ARGS((win_T *wp, int undo_sync, int no_curwin, int trigger_enter_autocmds, int trigger_leave_autocmds)); |
| static void win_free __ARGS((win_T *wp, tabpage_T *tp)); |
| static void frame_append __ARGS((frame_T *after, frame_T *frp)); |
| static void frame_insert __ARGS((frame_T *before, frame_T *frp)); |
| |
| *** 353,363 **** |
| && valid_tabpage(oldtab)) |
| { |
| newtab = curtab; |
| ! goto_tabpage_tp(oldtab, TRUE); |
| if (curwin == wp) |
| win_close(curwin, FALSE); |
| if (valid_tabpage(newtab)) |
| ! goto_tabpage_tp(newtab, TRUE); |
| } |
| } |
| break; |
| --- 353,363 ---- |
| && valid_tabpage(oldtab)) |
| { |
| newtab = curtab; |
| ! goto_tabpage_tp(oldtab, TRUE, TRUE); |
| if (curwin == wp) |
| win_close(curwin, FALSE); |
| if (valid_tabpage(newtab)) |
| ! goto_tabpage_tp(newtab, TRUE, TRUE); |
| } |
| } |
| break; |
| |
| *** 2124,2129 **** |
| --- 2124,2131 ---- |
| { |
| if (firstwin == lastwin) |
| { |
| + buf_T *old_curbuf = curbuf; |
| + |
| /* |
| * Closing the last window in a tab page. First go to another tab |
| * page and then close the window and the tab page. This avoids that |
| |
| *** 2132,2138 **** |
| * Don't trigger autocommands yet, they may use wrong values, so do |
| * that below. |
| */ |
| ! goto_tabpage_tp(alt_tabpage(), FALSE); |
| redraw_tabline = TRUE; |
| |
| /* Safety check: Autocommands may have closed the window when jumping |
| --- 2134,2140 ---- |
| * Don't trigger autocommands yet, they may use wrong values, so do |
| * that below. |
| */ |
| ! goto_tabpage_tp(alt_tabpage(), FALSE, TRUE); |
| redraw_tabline = TRUE; |
| |
| /* Safety check: Autocommands may have closed the window when jumping |
| |
| *** 2148,2155 **** |
| /* Since goto_tabpage_tp above did not trigger *Enter autocommands, do |
| * that now. */ |
| #ifdef FEAT_AUTOCMD |
| - apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); |
| apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); |
| #endif |
| return TRUE; |
| } |
| --- 2150,2159 ---- |
| /* Since goto_tabpage_tp above did not trigger *Enter autocommands, do |
| * that now. */ |
| #ifdef FEAT_AUTOCMD |
| apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); |
| + apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); |
| + if (old_curbuf != curbuf) |
| + apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf); |
| #endif |
| return TRUE; |
| } |
| |
| *** 2341,2347 **** |
| win_comp_pos(); |
| if (close_curwin) |
| { |
| ! win_enter_ext(wp, FALSE, TRUE); |
| #ifdef FEAT_AUTOCMD |
| if (other_buffer) |
| /* careful: after this wp and win may be invalid! */ |
| --- 2345,2351 ---- |
| win_comp_pos(); |
| if (close_curwin) |
| { |
| ! win_enter_ext(wp, FALSE, TRUE, TRUE, TRUE); |
| #ifdef FEAT_AUTOCMD |
| if (other_buffer) |
| /* careful: after this wp and win may be invalid! */ |
| |
| *** 3529,3535 **** |
| return FAIL; |
| |
| /* Remember the current windows in this Tab page. */ |
| ! if (leave_tabpage(curbuf) == FAIL) |
| { |
| vim_free(newtp); |
| return FAIL; |
| --- 3533,3539 ---- |
| return FAIL; |
| |
| /* Remember the current windows in this Tab page. */ |
| ! if (leave_tabpage(curbuf, TRUE) == FAIL) |
| { |
| vim_free(newtp); |
| return FAIL; |
| |
| *** 3574,3587 **** |
| |
| redraw_all_later(CLEAR); |
| #ifdef FEAT_AUTOCMD |
| - apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); |
| apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); |
| #endif |
| return OK; |
| } |
| |
| /* Failed, get back the previous Tab page */ |
| ! enter_tabpage(curtab, curbuf, TRUE); |
| return FAIL; |
| } |
| |
| --- 3578,3591 ---- |
| |
| redraw_all_later(CLEAR); |
| #ifdef FEAT_AUTOCMD |
| apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); |
| + apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); |
| #endif |
| return OK; |
| } |
| |
| /* Failed, get back the previous Tab page */ |
| ! enter_tabpage(curtab, curbuf, TRUE, TRUE); |
| return FAIL; |
| } |
| |
| |
| *** 3692,3700 **** |
| * Careful: When OK is returned need to get a new tab page very very soon! |
| */ |
| static int |
| ! leave_tabpage(new_curbuf) |
| buf_T *new_curbuf UNUSED; /* what is going to be the new curbuf, |
| NULL if unknown */ |
| { |
| tabpage_T *tp = curtab; |
| |
| --- 3696,3705 ---- |
| * Careful: When OK is returned need to get a new tab page very very soon! |
| */ |
| static int |
| ! leave_tabpage(new_curbuf, trigger_leave_autocmds) |
| buf_T *new_curbuf UNUSED; /* what is going to be the new curbuf, |
| NULL if unknown */ |
| + int trigger_leave_autocmds UNUSED; |
| { |
| tabpage_T *tp = curtab; |
| |
| |
| *** 3702,3719 **** |
| reset_VIsual_and_resel(); /* stop Visual mode */ |
| #endif |
| #ifdef FEAT_AUTOCMD |
| ! if (new_curbuf != curbuf) |
| { |
| ! apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); |
| if (curtab != tp) |
| return FAIL; |
| } |
| - apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf); |
| - if (curtab != tp) |
| - return FAIL; |
| - apply_autocmds(EVENT_TABLEAVE, NULL, NULL, FALSE, curbuf); |
| - if (curtab != tp) |
| - return FAIL; |
| #endif |
| #if defined(FEAT_GUI) |
| /* Remove the scrollbars. They may be added back later. */ |
| --- 3707,3727 ---- |
| reset_VIsual_and_resel(); /* stop Visual mode */ |
| #endif |
| #ifdef FEAT_AUTOCMD |
| ! if (trigger_leave_autocmds) |
| { |
| ! if (new_curbuf != curbuf) |
| ! { |
| ! apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); |
| ! if (curtab != tp) |
| ! return FAIL; |
| ! } |
| ! apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf); |
| ! if (curtab != tp) |
| ! return FAIL; |
| ! apply_autocmds(EVENT_TABLEAVE, NULL, NULL, FALSE, curbuf); |
| if (curtab != tp) |
| return FAIL; |
| } |
| #endif |
| #if defined(FEAT_GUI) |
| /* Remove the scrollbars. They may be added back later. */ |
| |
| *** 3734,3746 **** |
| /* |
| * Start using tab page "tp". |
| * Only to be used after leave_tabpage() or freeing the current tab page. |
| ! * Only trigger *Enter autocommands when trigger_autocmds is TRUE. |
| */ |
| static void |
| ! enter_tabpage(tp, old_curbuf, trigger_autocmds) |
| tabpage_T *tp; |
| buf_T *old_curbuf UNUSED; |
| ! int trigger_autocmds UNUSED; |
| { |
| int old_off = tp->tp_firstwin->w_winrow; |
| win_T *next_prevwin = tp->tp_prevwin; |
| --- 3742,3756 ---- |
| /* |
| * Start using tab page "tp". |
| * Only to be used after leave_tabpage() or freeing the current tab page. |
| ! * Only trigger *Enter autocommands when trigger_enter_autocmds is TRUE. |
| ! * Only trigger *Leave autocommands when trigger_leave_autocmds is TRUE. |
| */ |
| static void |
| ! enter_tabpage(tp, old_curbuf, trigger_enter_autocmds, trigger_leave_autocmds) |
| tabpage_T *tp; |
| buf_T *old_curbuf UNUSED; |
| ! int trigger_enter_autocmds UNUSED; |
| ! int trigger_leave_autocmds UNUSED; |
| { |
| int old_off = tp->tp_firstwin->w_winrow; |
| win_T *next_prevwin = tp->tp_prevwin; |
| |
| *** 3753,3759 **** |
| /* We would like doing the TabEnter event first, but we don't have a |
| * valid current window yet, which may break some commands. |
| * This triggers autocommands, thus may make "tp" invalid. */ |
| ! win_enter_ext(tp->tp_curwin, FALSE, TRUE); |
| prevwin = next_prevwin; |
| |
| last_status(FALSE); /* status line may appear or disappear */ |
| --- 3763,3769 ---- |
| /* We would like doing the TabEnter event first, but we don't have a |
| * valid current window yet, which may break some commands. |
| * This triggers autocommands, thus may make "tp" invalid. */ |
| ! win_enter_ext(tp->tp_curwin, FALSE, TRUE, trigger_enter_autocmds, trigger_leave_autocmds); |
| prevwin = next_prevwin; |
| |
| last_status(FALSE); /* status line may appear or disappear */ |
| |
| *** 3788,3794 **** |
| #ifdef FEAT_AUTOCMD |
| /* Apply autocommands after updating the display, when 'rows' and |
| * 'columns' have been set correctly. */ |
| ! if (trigger_autocmds) |
| { |
| apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); |
| if (old_curbuf != curbuf) |
| --- 3798,3804 ---- |
| #ifdef FEAT_AUTOCMD |
| /* Apply autocommands after updating the display, when 'rows' and |
| * 'columns' have been set correctly. */ |
| ! if (trigger_enter_autocmds) |
| { |
| apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); |
| if (old_curbuf != curbuf) |
| |
| *** 3869,3875 **** |
| } |
| } |
| |
| ! goto_tabpage_tp(tp, TRUE); |
| |
| #ifdef FEAT_GUI_TABLINE |
| if (gui_use_tabline()) |
| --- 3879,3885 ---- |
| } |
| } |
| |
| ! goto_tabpage_tp(tp, TRUE, TRUE); |
| |
| #ifdef FEAT_GUI_TABLINE |
| if (gui_use_tabline()) |
| |
| *** 3879,3901 **** |
| |
| /* |
| * Go to tabpage "tp". |
| ! * Only trigger *Enter autocommands when trigger_autocmds is TRUE. |
| * Note: doesn't update the GUI tab. |
| */ |
| void |
| ! goto_tabpage_tp(tp, trigger_autocmds) |
| tabpage_T *tp; |
| ! int trigger_autocmds; |
| { |
| /* Don't repeat a message in another tab page. */ |
| set_keep_msg(NULL, 0); |
| |
| ! if (tp != curtab && leave_tabpage(tp->tp_curwin->w_buffer) == OK) |
| { |
| if (valid_tabpage(tp)) |
| ! enter_tabpage(tp, curbuf, trigger_autocmds); |
| else |
| ! enter_tabpage(curtab, curbuf, trigger_autocmds); |
| } |
| } |
| |
| --- 3889,3916 ---- |
| |
| /* |
| * Go to tabpage "tp". |
| ! * Only trigger *Enter autocommands when trigger_enter_autocmds is TRUE. |
| ! * Only trigger *Leave autocommands when trigger_leave_autocmds is TRUE. |
| * Note: doesn't update the GUI tab. |
| */ |
| void |
| ! goto_tabpage_tp(tp, trigger_enter_autocmds, trigger_leave_autocmds) |
| tabpage_T *tp; |
| ! int trigger_enter_autocmds; |
| ! int trigger_leave_autocmds; |
| { |
| /* Don't repeat a message in another tab page. */ |
| set_keep_msg(NULL, 0); |
| |
| ! if (tp != curtab && leave_tabpage(tp->tp_curwin->w_buffer, |
| ! trigger_leave_autocmds) == OK) |
| { |
| if (valid_tabpage(tp)) |
| ! enter_tabpage(tp, curbuf, trigger_enter_autocmds, |
| ! trigger_leave_autocmds); |
| else |
| ! enter_tabpage(curtab, curbuf, trigger_enter_autocmds, |
| ! trigger_leave_autocmds); |
| } |
| } |
| |
| |
| *** 3908,3914 **** |
| tabpage_T *tp; |
| win_T *wp; |
| { |
| ! goto_tabpage_tp(tp, TRUE); |
| if (curtab == tp && win_valid(wp)) |
| { |
| win_enter(wp, TRUE); |
| --- 3923,3929 ---- |
| tabpage_T *tp; |
| win_T *wp; |
| { |
| ! goto_tabpage_tp(tp, TRUE, TRUE); |
| if (curtab == tp && win_valid(wp)) |
| { |
| win_enter(wp, TRUE); |
| |
| *** 4168,4174 **** |
| win_T *wp; |
| int undo_sync; |
| { |
| ! win_enter_ext(wp, undo_sync, FALSE); |
| } |
| |
| /* |
| --- 4183,4189 ---- |
| win_T *wp; |
| int undo_sync; |
| { |
| ! win_enter_ext(wp, undo_sync, FALSE, TRUE, TRUE); |
| } |
| |
| /* |
| |
| *** 4177,4186 **** |
| * been closed and isn't valid. |
| */ |
| static void |
| ! win_enter_ext(wp, undo_sync, curwin_invalid) |
| win_T *wp; |
| int undo_sync; |
| int curwin_invalid; |
| { |
| #ifdef FEAT_AUTOCMD |
| int other_buffer = FALSE; |
| --- 4192,4203 ---- |
| * been closed and isn't valid. |
| */ |
| static void |
| ! win_enter_ext(wp, undo_sync, curwin_invalid, trigger_enter_autocmds, trigger_leave_autocmds) |
| win_T *wp; |
| int undo_sync; |
| int curwin_invalid; |
| + int trigger_enter_autocmds UNUSED; |
| + int trigger_leave_autocmds UNUSED; |
| { |
| #ifdef FEAT_AUTOCMD |
| int other_buffer = FALSE; |
| |
| *** 4190,4196 **** |
| return; |
| |
| #ifdef FEAT_AUTOCMD |
| ! if (!curwin_invalid) |
| { |
| /* |
| * Be careful: If autocommands delete the window, return now. |
| --- 4207,4213 ---- |
| return; |
| |
| #ifdef FEAT_AUTOCMD |
| ! if (!curwin_invalid && trigger_leave_autocmds) |
| { |
| /* |
| * Be careful: If autocommands delete the window, return now. |
| |
| *** 4259,4267 **** |
| } |
| |
| #ifdef FEAT_AUTOCMD |
| ! apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); |
| ! if (other_buffer) |
| ! apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf); |
| #endif |
| |
| #ifdef FEAT_TITLE |
| --- 4276,4287 ---- |
| } |
| |
| #ifdef FEAT_AUTOCMD |
| ! if (trigger_enter_autocmds) |
| ! { |
| ! apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); |
| ! if (other_buffer) |
| ! apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf); |
| ! } |
| #endif |
| |
| #ifdef FEAT_TITLE |
| |
| |
| |
| *** 730,731 **** |
| --- 730,733 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 926, |
| /**/ |
| |
| -- |
| Bravely bold Sir Robin, rode forth from Camelot, |
| He was not afraid to die, Oh Brave Sir Robin, |
| He was not at all afraid to be killed in nasty ways |
| Brave, brave, brave, brave Sir Robin. |
| "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |