0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 7.4.1913

Problem:    When ":doautocmd" is used modelines are used even when no
            autocommands were executed. (Daniel Hahler)
Solution:   Skip processing modelines. (closes #854)
This commit is contained in:
Bram Moolenaar
2016-06-09 22:53:01 +02:00
parent 1cee693b31
commit 1610d05241
5 changed files with 20 additions and 9 deletions

View File

@@ -3096,7 +3096,7 @@ do_write(exarg_T *eap)
{ {
if (au_has_group((char_u *)"filetypedetect")) if (au_has_group((char_u *)"filetypedetect"))
(void)do_doautocmd((char_u *)"filetypedetect BufRead", (void)do_doautocmd((char_u *)"filetypedetect BufRead",
TRUE); TRUE, NULL);
do_modelines(0); do_modelines(0);
} }

View File

@@ -5449,9 +5449,11 @@ ex_doautocmd(exarg_T *eap)
{ {
char_u *arg = eap->arg; char_u *arg = eap->arg;
int call_do_modelines = check_nomodeline(&arg); int call_do_modelines = check_nomodeline(&arg);
int did_aucmd;
(void)do_doautocmd(arg, TRUE); (void)do_doautocmd(arg, TRUE, &did_aucmd);
if (call_do_modelines) /* Only when there is no <nomodeline>. */ /* Only when there is no <nomodeline>. */
if (call_do_modelines && did_aucmd)
do_modelines(0); do_modelines(0);
} }
#endif #endif
@@ -11896,7 +11898,7 @@ ex_filetype(exarg_T *eap)
} }
if (*arg == 'd') if (*arg == 'd')
{ {
(void)do_doautocmd((char_u *)"filetypedetect BufRead", TRUE); (void)do_doautocmd((char_u *)"filetypedetect BufRead", TRUE, NULL);
do_modelines(0); do_modelines(0);
} }
} }

View File

@@ -5162,7 +5162,7 @@ set_rw_fname(char_u *fname, char_u *sfname)
if (*curbuf->b_p_ft == NUL) if (*curbuf->b_p_ft == NUL)
{ {
if (au_has_group((char_u *)"filetypedetect")) if (au_has_group((char_u *)"filetypedetect"))
(void)do_doautocmd((char_u *)"filetypedetect BufRead", FALSE); (void)do_doautocmd((char_u *)"filetypedetect BufRead", FALSE, NULL);
do_modelines(0); do_modelines(0);
} }
#endif #endif
@@ -8688,12 +8688,16 @@ do_autocmd_event(
int int
do_doautocmd( do_doautocmd(
char_u *arg, char_u *arg,
int do_msg) /* give message for no matching autocmds? */ int do_msg, /* give message for no matching autocmds? */
int *did_something)
{ {
char_u *fname; char_u *fname;
int nothing_done = TRUE; int nothing_done = TRUE;
int group; int group;
if (did_something != NULL)
did_something = FALSE;
/* /*
* Check for a legal group name. If not, use AUGROUP_ALL. * Check for a legal group name. If not, use AUGROUP_ALL.
*/ */
@@ -8727,6 +8731,8 @@ do_doautocmd(
if (nothing_done && do_msg) if (nothing_done && do_msg)
MSG(_("No matching autocommands")); MSG(_("No matching autocommands"));
if (did_something != NULL)
*did_something = !nothing_done;
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
return aborting() ? FAIL : OK; return aborting() ? FAIL : OK;
@@ -8746,6 +8752,7 @@ ex_doautoall(exarg_T *eap)
buf_T *buf; buf_T *buf;
char_u *arg = eap->arg; char_u *arg = eap->arg;
int call_do_modelines = check_nomodeline(&arg); int call_do_modelines = check_nomodeline(&arg);
int did_aucmd;
/* /*
* This is a bit tricky: For some commands curwin->w_buffer needs to be * This is a bit tricky: For some commands curwin->w_buffer needs to be
@@ -8762,9 +8769,9 @@ ex_doautoall(exarg_T *eap)
aucmd_prepbuf(&aco, buf); aucmd_prepbuf(&aco, buf);
/* execute the autocommands for this buffer */ /* execute the autocommands for this buffer */
retval = do_doautocmd(arg, FALSE); retval = do_doautocmd(arg, FALSE, &did_aucmd);
if (call_do_modelines) if (call_do_modelines && did_aucmd)
{ {
/* Execute the modeline settings, but don't set window-local /* Execute the modeline settings, but don't set window-local
* options if we are using the current window for another * options if we are using the current window for another

View File

@@ -34,7 +34,7 @@ int check_ei(void);
char_u *au_event_disable(char *what); char_u *au_event_disable(char *what);
void au_event_restore(char_u *old_ei); void au_event_restore(char_u *old_ei);
void do_autocmd(char_u *arg, int forceit); void do_autocmd(char_u *arg, int forceit);
int do_doautocmd(char_u *arg, int do_msg); int do_doautocmd(char_u *arg, int do_msg, int *did_something);
void ex_doautoall(exarg_T *eap); void ex_doautoall(exarg_T *eap);
int check_nomodeline(char_u **argp); int check_nomodeline(char_u **argp);
void aucmd_prepbuf(aco_save_T *aco, buf_T *buf); void aucmd_prepbuf(aco_save_T *aco, buf_T *buf);

View File

@@ -753,6 +753,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 */
/**/
1913,
/**/ /**/
1912, 1912,
/**/ /**/