updated for version 7.1-125
diff --git a/src/buffer.c b/src/buffer.c
index c947901..c29fb23 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -5515,11 +5515,11 @@
#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
index b6f3354..23142cf 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -840,11 +840,11 @@
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 @@
# 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
index 4a311b4..f417619 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -5925,7 +5925,7 @@
# 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 @@
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 @@
# 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 @@
# ifdef FEAT_AUTOCMD
/* Don't execute autocommands while deleting the window. */
- ++autocmd_block;
+ block_autocmds();
# endif
wp = curwin;
bp = curbuf;
@@ -6122,7 +6125,7 @@
win_size_restore(&winsizes);
# ifdef FEAT_AUTOCMD
- --autocmd_block;
+ unblock_autocmds();
# endif
}
diff --git a/src/fileio.c b/src/fileio.c
index 801caba..84416df 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -7165,6 +7165,7 @@
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 @@
* 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 @@
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
index ede2e2e..7fec4e6 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -366,7 +366,6 @@
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
index 9e314c2..165b65b 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -972,7 +972,7 @@
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
index 068117a..fd7a04f 100644
--- a/src/proto/fileio.pro
+++ b/src/proto/fileio.pro
@@ -40,6 +40,8 @@
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
index 3a310ad..eef1e88 100644
--- a/src/version.c
+++ b/src/version.c
@@ -667,6 +667,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 125,
+/**/
124,
/**/
123,
diff --git a/src/window.c b/src/window.c
index 95f4a24..74e3646 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1291,7 +1291,7 @@
* 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 @@
}
#ifdef FEAT_AUTOCMD
- --autocmd_block;
+ unblock_autocmds();
#endif
/* return actual number of windows */
@@ -3415,7 +3415,7 @@
* 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 @@
break;
#ifdef FEAT_AUTOCMD
- --autocmd_block;
+ unblock_autocmds();
#endif
/* return actual number of tab pages */
@@ -4162,7 +4162,7 @@
/* 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 @@
foldInitWin(newwin);
#endif
#ifdef FEAT_AUTOCMD
- --autocmd_block;
+ unblock_autocmds();
#endif
#ifdef FEAT_SEARCH_EXTRA
newwin->w_match_head = NULL;
@@ -4232,7 +4232,7 @@
#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 @@
vim_free(wp);
#ifdef FEAT_AUTOCMD
- --autocmd_block;
+ unblock_autocmds();
#endif
}