]> granicus.if.org Git - vim/commitdiff
patch 7.4.1913 v7.4.1913
authorBram Moolenaar <Bram@vim.org>
Thu, 9 Jun 2016 20:53:01 +0000 (22:53 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 9 Jun 2016 20:53:01 +0000 (22:53 +0200)
Problem:    When ":doautocmd" is used modelines are used even when no
            autocommands were executed. (Daniel Hahler)
Solution:   Skip processing modelines. (closes #854)

src/ex_cmds.c
src/ex_docmd.c
src/fileio.c
src/proto/fileio.pro
src/version.c

index 2c7742eab88172c906b95446be8d703b8155fbcf..5e56489a319afc70a9e95ef3f40322714f1eb614 100644 (file)
@@ -3096,7 +3096,7 @@ do_write(exarg_T *eap)
            {
                if (au_has_group((char_u *)"filetypedetect"))
                    (void)do_doautocmd((char_u *)"filetypedetect BufRead",
-                                                                       TRUE);
+                                                                 TRUE, NULL);
                do_modelines(0);
            }
 
index 4f501aa45448748931a89b0fe6c2a61672189ce2..55c093fb092243849b1ec820d23e2f00c13dc62c 100644 (file)
@@ -5449,9 +5449,11 @@ ex_doautocmd(exarg_T *eap)
 {
     char_u     *arg = eap->arg;
     int                call_do_modelines = check_nomodeline(&arg);
+    int                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);
 }
 #endif
@@ -11896,7 +11898,7 @@ 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);
        }
     }
index c07accccadc7ad1298b4a05e022d11dfe4b8b733..37b43a39a92b14ee31dcfeb7f2a8e1f3d37e9305 100644 (file)
@@ -5162,7 +5162,7 @@ set_rw_fname(char_u *fname, char_u *sfname)
     if (*curbuf->b_p_ft == NUL)
     {
        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);
     }
 #endif
@@ -8688,12 +8688,16 @@ do_autocmd_event(
     int
 do_doautocmd(
     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;
     int                nothing_done = TRUE;
     int                group;
 
+    if (did_something != NULL)
+       did_something = FALSE;
+
     /*
      * Check for a legal group name.  If not, use AUGROUP_ALL.
      */
@@ -8727,6 +8731,8 @@ do_doautocmd(
 
     if (nothing_done && do_msg)
        MSG(_("No matching autocommands"));
+    if (did_something != NULL)
+       *did_something = !nothing_done;
 
 #ifdef FEAT_EVAL
     return aborting() ? FAIL : OK;
@@ -8746,6 +8752,7 @@ ex_doautoall(exarg_T *eap)
     buf_T      *buf;
     char_u     *arg = eap->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
@@ -8762,9 +8769,9 @@ ex_doautoall(exarg_T *eap)
            aucmd_prepbuf(&aco, buf);
 
            /* 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
                 * options if we are using the current window for another
index 9cd64143600e43c8738c3e6a231b7907761aae47..c3cbca52b7820e3c48371bb95ae8fe7e93eb886c 100644 (file)
@@ -34,7 +34,7 @@ int check_ei(void);
 char_u *au_event_disable(char *what);
 void au_event_restore(char_u *old_ei);
 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);
 int check_nomodeline(char_u **argp);
 void aucmd_prepbuf(aco_save_T *aco, buf_T *buf);
index 9fdd93f17cfb2bb5d47bed1bf0e2ae5246280350..563ac9f1aeadfe13da5a38e38bc805e4ecb029fa 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1913,
 /**/
     1912,
 /**/