diff src/fileio.c @ 8937:da4f6e238374 v7.4.1754

commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Apr 20 12:49:49 2016 +0200 patch 7.4.1754 Problem: When 'filetype' was set and reloading a buffer which does not cause it to be set, the syntax isn't loaded. (KillTheMule) Solution: Remember whether the FileType event was fired and fire it if not. (Anton Lindqvist, closes #747)
author Christian Brabandt <cb@256bit.org>
date Wed, 20 Apr 2016 13:00:06 +0200
parents 05b88224cea1
children 0a3bc9fdea20
line wrap: on
line diff
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -143,6 +143,18 @@ static void vim_settempdir(char_u *tempd
 static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
 #endif
 
+#ifdef FEAT_AUTOCMD
+/*
+ * Set by the apply_autocmds_group function if the given event is equal to
+ * EVENT_FILETYPE. Used by the readfile function in order to determine if
+ * EVENT_BUFREADPOST triggered the EVENT_FILETYPE.
+ *
+ * Relying on this value requires one to reset it prior calling
+ * apply_autocmds_group.
+ */
+static int au_did_filetype INIT(= FALSE);
+#endif
+
     void
 filemess(
     buf_T	*buf,
@@ -305,6 +317,10 @@ readfile(
     int		using_b_fname;
 #endif
 
+#ifdef FEAT_AUTOCMD
+    au_did_filetype = FALSE; /* reset before triggering any autocommands */
+#endif
+
     curbuf->b_no_eol_lnum = 0;	/* in case it was set by the previous read */
 
     /*
@@ -2669,8 +2685,17 @@ failed:
 	    apply_autocmds_exarg(EVENT_FILTERREADPOST, NULL, sfname,
 							  FALSE, curbuf, eap);
 	else if (newfile)
+	{
 	    apply_autocmds_exarg(EVENT_BUFREADPOST, NULL, sfname,
 							  FALSE, curbuf, eap);
+	    if (!au_did_filetype && *curbuf->b_p_ft != NUL)
+		/*
+		 * EVENT_FILETYPE was not triggered but the buffer already has a
+		 * filetype. Trigger EVENT_FILETYPE using the existing filetype.
+		 */
+		apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname,
+			TRUE, curbuf);
+	}
 	else
 	    apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname,
 							    FALSE, NULL, eap);
@@ -9537,6 +9562,9 @@ BYPASS_AU:
     if (event == EVENT_BUFWIPEOUT && buf != NULL)
 	aubuflocal_remove(buf);
 
+    if (retval == OK && event == EVENT_FILETYPE)
+	au_did_filetype = TRUE;
+
     return retval;
 }