vim-patch:7.4.1913 (#5260)

Problem:    When ":doautocmd" is used modelines are used even when no
            autocommands were executed. (Daniel Hahler)
Solution:   Skip processing modelines. (closes vim/vim#854)

1610d05241
This commit is contained in:
Jurica Bradarić
2016-09-04 23:43:41 +02:00
committed by Justin M. Keyes
parent 0f381f26cb
commit 73b8424fad
4 changed files with 33 additions and 19 deletions

View File

@@ -1711,11 +1711,11 @@ int do_write(exarg_T *eap)
goto theend;
}
/* If 'filetype' was empty try detecting it now. */
// If 'filetype' was empty try detecting it now.
if (*curbuf->b_p_ft == NUL) {
if (au_has_group((char_u *)"filetypedetect"))
(void)do_doautocmd((char_u *)"filetypedetect BufRead",
TRUE);
if (au_has_group((char_u *)"filetypedetect")) {
(void)do_doautocmd((char_u *)"filetypedetect BufRead", true, NULL);
}
do_modelines(0);
}

View File

@@ -4366,11 +4366,14 @@ static void ex_doautocmd(exarg_T *eap)
{
char_u *arg = eap->arg;
int call_do_modelines = check_nomodeline(&arg);
bool did_aucmd;
(void)do_doautocmd(arg, TRUE);
if (call_do_modelines) /* Only when there is no <nomodeline>. */
(void)do_doautocmd(arg, true, &did_aucmd);
// Only when there is no <nomodeline>.
if (call_do_modelines && did_aucmd) {
do_modelines(0);
}
}
/*
* :[N]bunload[!] [N] [bufname] unload buffer
@@ -9464,7 +9467,7 @@ static void ex_filetype(exarg_T *eap)
}
}
if (*arg == 'd') {
(void)do_doautocmd((char_u *)"filetypedetect BufRead", TRUE);
(void)do_doautocmd((char_u *)"filetypedetect BufRead", true, NULL);
do_modelines(0);
}
} else if (STRCMP(arg, "off") == 0) {

View File

@@ -3773,8 +3773,9 @@ static int set_rw_fname(char_u *fname, char_u *sfname)
/* Do filetype detection now if 'filetype' is empty. */
if (*curbuf->b_p_ft == NUL) {
if (au_has_group((char_u *)"filetypedetect"))
(void)do_doautocmd((char_u *)"filetypedetect BufRead", FALSE);
if (au_has_group((char_u *)"filetypedetect")) {
(void)do_doautocmd((char_u *)"filetypedetect BufRead", false, NULL);
}
do_modelines(0);
}
@@ -6058,13 +6059,18 @@ static int do_autocmd_event(event_T event, char_u *pat, int nested, char_u *cmd,
int
do_doautocmd (
char_u *arg,
int do_msg /* give message for no matching autocmds? */
int do_msg, // give message for no matching autocmds?
bool *did_something
)
{
char_u *fname;
int nothing_done = TRUE;
int group;
if (did_something != NULL) {
*did_something = false;
}
/*
* Check for a legal group name. If not, use AUGROUP_ALL.
*/
@@ -6093,8 +6099,12 @@ do_doautocmd (
fname, NULL, TRUE, group, curbuf, NULL))
nothing_done = FALSE;
if (nothing_done && do_msg)
if (nothing_done && do_msg) {
MSG(_("No matching autocommands"));
}
if (did_something != NULL) {
*did_something = !nothing_done;
}
return aborting() ? FAIL : OK;
}
@@ -6123,13 +6133,14 @@ void ex_doautoall(exarg_T *eap)
/* find a window for this buffer and save some values */
aucmd_prepbuf(&aco, buf);
/* execute the autocommands for this buffer */
retval = do_doautocmd(arg, FALSE);
bool did_aucmd;
// execute the autocommands for this buffer
retval = do_doautocmd(arg, false, &did_aucmd);
if (call_do_modelines) {
/* Execute the modeline settings, but don't set window-local
* options if we are using the current window for another
* buffer. */
if (call_do_modelines && did_aucmd) {
// Execute the modeline settings, but don't set window-local
// options if we are using the current window for another
// buffer.
do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
}

View File

@@ -363,7 +363,7 @@ static int included_patches[] = {
// 1916 NA
// 1915 NA
// 1914,
// 1913,
1913,
// 1912,
// 1911,
// 1910,