changeset 14099:1157f16150b3 v8.1.0067

patch 8.1.0067: syntax highlighting not working when re-entering a buffer commit https://github.com/vim/vim/commit/a5616b0136cea2104a475d143a1685d71e9b2d3d Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jun 17 19:08:30 2018 +0200 patch 8.1.0067: syntax highlighting not working when re-entering a buffer Problem: Syntax highlighting not working when re-entering a buffer. Solution: Do force executing autocommands when not called recursively.
author Christian Brabandt <cb@256bit.org>
date Sun, 17 Jun 2018 19:15:05 +0200
parents d9ce494519f8
children 8729adac8e04
files src/option.c src/version.c
diffstat 2 files changed, 19 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/option.c
+++ b/src/option.c
@@ -7567,24 +7567,32 @@ did_set_string_option(
 	/* When 'syntax' is set, load the syntax of that name */
 	if (varp == &(curbuf->b_p_syn))
 	{
-	    // Only pass TRUE for "force" when the value changed, to avoid
-	    // endless recurrence. */
-	    apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn,
-				       curbuf->b_fname, value_changed, curbuf);
+	    static int syn_recursive = 0;
+
+	    ++syn_recursive;
+	    // Only pass TRUE for "force" when the value changed or not used
+	    // recursively, to avoid endless recurrence.
+	    apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn, curbuf->b_fname,
+		    value_changed || syn_recursive == 1, curbuf);
+	    --syn_recursive;
 	}
 #endif
 	else if (varp == &(curbuf->b_p_ft))
 	{
 	    /* 'filetype' is set, trigger the FileType autocommand.
 	     * Skip this when called from a modeline and the filetype was
-	     * already set to this value.
-	     * Only pass TRUE for "force" when the value changed, to avoid
-	     * endless recurrence. */
+	     * already set to this value. */
 	    if (!(opt_flags & OPT_MODELINE) || value_changed)
 	    {
+		static int ft_recursive = 0;
+
+		++ft_recursive;
 		did_filetype = TRUE;
-		apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft,
-				       curbuf->b_fname, value_changed, curbuf);
+		// Only pass TRUE for "force" when the value changed or not
+		// used recursively, to avoid endless recurrence.
+		apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname,
+				   value_changed || ft_recursive == 1, curbuf);
+		--ft_recursive;
 		/* Just in case the old "curbuf" is now invalid. */
 		if (varp != &(curbuf->b_p_ft))
 		    varp = NULL;
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    67,
+/**/
     66,
 /**/
     65,