# HG changeset patch # User vimboss # Date 1191068201 0 # Node ID cdd82acd75b449784a574058387449096667e56f # Parent 4ee809acd1ab9c2fadee72e0fae32de57040447b updated for version 7.1-125 diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -5515,11 +5515,11 @@ wipe_buffer(buf, aucmd) #ifdef FEAT_AUTOCMD if (!aucmd) /* Don't trigger BufDelete autocommands here. */ - ++autocmd_block; + block_autocmds(); #endif close_buffer(NULL, buf, DOBUF_WIPE); #ifdef FEAT_AUTOCMD if (!aucmd) - --autocmd_block; + unblock_autocmds(); #endif } diff --git a/src/diff.c b/src/diff.c --- a/src/diff.c +++ b/src/diff.c @@ -840,11 +840,11 @@ diff_file(tmp_orig, tmp_new, tmp_diff) tmp_orig, tmp_new); append_redir(cmd, p_srr, tmp_diff); #ifdef FEAT_AUTOCMD - ++autocmd_block; /* Avoid ShellCmdPost stuff */ + block_autocmds(); /* Avoid ShellCmdPost stuff */ #endif (void)call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT); #ifdef FEAT_AUTOCMD - --autocmd_block; + unblock_autocmds(); #endif vim_free(cmd); } @@ -949,11 +949,11 @@ ex_diffpatch(eap) # endif eap->arg); #ifdef FEAT_AUTOCMD - ++autocmd_block; /* Avoid ShellCmdPost stuff */ + block_autocmds(); /* Avoid ShellCmdPost stuff */ #endif (void)call_shell(buf, SHELL_FILTER | SHELL_COOKED); #ifdef FEAT_AUTOCMD - --autocmd_block; + unblock_autocmds(); #endif } diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -5925,7 +5925,7 @@ ex_window() # ifdef FEAT_AUTOCMD /* Don't execute autocommands while creating the window. */ - ++autocmd_block; + block_autocmds(); # endif /* don't use a new tab page */ cmdmod.tab = 0; @@ -5934,6 +5934,9 @@ ex_window() if (win_split((int)p_cwh, WSP_BOT) == FAIL) { beep_flush(); +# ifdef FEAT_AUTOCMD + unblock_autocmds(); +# endif return K_IGNORE; } cmdwin_type = ccline.cmdfirstc; @@ -5956,7 +5959,7 @@ ex_window() # ifdef FEAT_AUTOCMD /* Do execute autocommands for setting the filetype (load syntax). */ - --autocmd_block; + unblock_autocmds(); # endif /* Showing the prompt may have set need_wait_return, reset it. */ @@ -6110,7 +6113,7 @@ ex_window() # ifdef FEAT_AUTOCMD /* Don't execute autocommands while deleting the window. */ - ++autocmd_block; + block_autocmds(); # endif wp = curwin; bp = curbuf; @@ -6122,7 +6125,7 @@ ex_window() win_size_restore(&winsizes); # ifdef FEAT_AUTOCMD - --autocmd_block; + unblock_autocmds(); # endif } diff --git a/src/fileio.c b/src/fileio.c --- a/src/fileio.c +++ b/src/fileio.c @@ -7165,6 +7165,7 @@ static void auto_next_pat __ARGS((AutoPa static event_T last_event; static int last_group; +static int autocmd_blocked = 0; /* block all autocmds */ /* * Show the autocommands for one AutoPat. @@ -8454,7 +8455,7 @@ apply_autocmds_group(event, fname, fname * Quickly return if there are no autocommands for this event or * autocommands are blocked. */ - if (first_autopat[(int)event] == NULL || autocmd_block > 0) + if (first_autopat[(int)event] == NULL || autocmd_blocked > 0) goto BYPASS_AU; /* @@ -8768,6 +8769,40 @@ BYPASS_AU: return retval; } +# ifdef FEAT_EVAL +static char_u *old_termresponse = NULL; +# endif + +/* + * Block triggering autocommands until unblock_autocmd() is called. + * Can be used recursively, so long as it's symmetric. + */ + void +block_autocmds() +{ +# ifdef FEAT_EVAL + /* Remember the value of v:termresponse. */ + if (autocmd_blocked == 0) + old_termresponse = get_vim_var_str(VV_TERMRESPONSE); +# endif + ++autocmd_blocked; +} + + void +unblock_autocmds() +{ + --autocmd_blocked; + +# ifdef FEAT_EVAL + /* When v:termresponse was set while autocommands were blocked, trigger + * the autocommands now. Esp. useful when executing a shell command + * during startup (vimdiff). */ + if (autocmd_blocked == 0 + && get_vim_var_str(VV_TERMRESPONSE) != old_termresponse) + apply_autocmds(EVENT_TERMRESPONSE, NULL, NULL, FALSE, curbuf); +# endif +} + /* * Find next autocommand pattern that matches. */ diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -366,7 +366,6 @@ EXTERN int cterm_normal_bg_color INIT(= EXTERN int autocmd_busy INIT(= FALSE); /* Is apply_autocmds() busy? */ EXTERN int autocmd_no_enter INIT(= FALSE); /* *Enter autocmds disabled */ EXTERN int autocmd_no_leave INIT(= FALSE); /* *Leave autocmds disabled */ -EXTERN int autocmd_block INIT(= 0); /* block all autocmds */ EXTERN int modified_was_set; /* did ":set modified" */ EXTERN int did_filetype INIT(= FALSE); /* FileType event found */ EXTERN int keep_filetype INIT(= FALSE); /* value for did_filetype when diff --git a/src/misc2.c b/src/misc2.c --- a/src/misc2.c +++ b/src/misc2.c @@ -972,7 +972,7 @@ free_all_mem() return; entered = TRUE; - ++autocmd_block; /* don't want to trigger autocommands here */ + block_autocmds(); /* don't want to trigger autocommands here */ #ifdef FEAT_WINDOWS /* close all tabs and windows */ diff --git a/src/proto/fileio.pro b/src/proto/fileio.pro --- a/src/proto/fileio.pro +++ b/src/proto/fileio.pro @@ -40,6 +40,8 @@ int has_cursorhold __ARGS((void)); int trigger_cursorhold __ARGS((void)); int has_cursormoved __ARGS((void)); int has_cursormovedI __ARGS((void)); +void block_autocmds __ARGS((void)); +void unblock_autocmds __ARGS((void)); int has_autocmd __ARGS((event_T event, char_u *sfname, buf_T *buf)); char_u *get_augroup_name __ARGS((expand_T *xp, int idx)); char_u *set_context_in_autocmd __ARGS((expand_T *xp, char_u *arg, int doautocmd)); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -667,6 +667,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 125, +/**/ 124, /**/ 123, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -1291,7 +1291,7 @@ make_windows(count, vertical) * Don't execute autocommands while creating the windows. Must do that * when putting the buffers in the windows. */ - ++autocmd_block; + block_autocmds(); #endif /* todo is number of windows left to create */ @@ -1313,7 +1313,7 @@ make_windows(count, vertical) } #ifdef FEAT_AUTOCMD - --autocmd_block; + unblock_autocmds(); #endif /* return actual number of windows */ @@ -3415,7 +3415,7 @@ make_tabpages(maxcount) * Don't execute autocommands while creating the tab pages. Must do that * when putting the buffers in the windows. */ - ++autocmd_block; + block_autocmds(); #endif for (todo = count - 1; todo > 0; --todo) @@ -3423,7 +3423,7 @@ make_tabpages(maxcount) break; #ifdef FEAT_AUTOCMD - --autocmd_block; + unblock_autocmds(); #endif /* return actual number of tab pages */ @@ -4162,7 +4162,7 @@ win_alloc(after) /* Don't execute autocommands while the window is not properly * initialized yet. gui_create_scrollbar() may trigger a FocusGained * event. */ - ++autocmd_block; + block_autocmds(); #endif /* * link the window in the window list @@ -4207,7 +4207,7 @@ win_alloc(after) foldInitWin(newwin); #endif #ifdef FEAT_AUTOCMD - --autocmd_block; + unblock_autocmds(); #endif #ifdef FEAT_SEARCH_EXTRA newwin->w_match_head = NULL; @@ -4232,7 +4232,7 @@ win_free(wp, tp) #ifdef FEAT_AUTOCMD /* Don't execute autocommands while the window is halfway being deleted. * gui_mch_destroy_scrollbar() may trigger a FocusGained event. */ - ++autocmd_block; + block_autocmds(); #endif #ifdef FEAT_MZSCHEME @@ -4295,7 +4295,7 @@ win_free(wp, tp) vim_free(wp); #ifdef FEAT_AUTOCMD - --autocmd_block; + unblock_autocmds(); #endif }