summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-04-20 12:49:49 +0200
committerBram Moolenaar <Bram@vim.org>2016-04-20 12:49:49 +0200
commitc3691332f72169c486066200c0f3935418364900 (patch)
treecc88c3f0eeb5d4b2b145a20a148e8307e3ffa43c
parentc020042083b9c0a4e932b562c3bef97c76328e18 (diff)
downloadvim-git-c3691332f72169c486066200c0f3935418364900.tar.gz
patch 7.4.1754v7.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)
-rw-r--r--src/fileio.c28
-rw-r--r--src/testdir/test_syntax.vim15
-rw-r--r--src/version.c2
3 files changed, 45 insertions, 0 deletions
diff --git a/src/fileio.c b/src/fileio.c
index ed8d45ba1..0ddd07928 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -143,6 +143,18 @@ static void vim_settempdir(char_u *tempdir);
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;
}
diff --git a/src/testdir/test_syntax.vim b/src/testdir/test_syntax.vim
index 297e8359a..4b88fe33f 100644
--- a/src/testdir/test_syntax.vim
+++ b/src/testdir/test_syntax.vim
@@ -65,3 +65,18 @@ func Test_syn_iskeyword()
quit!
endfunc
+
+func Test_syntax_after_reload()
+ split Xsomefile
+ call setline(1, ['hello', 'there'])
+ w!
+ only!
+ setl filetype=hello
+ au FileType hello let g:gotit = 1
+ call assert_false(exists('g:gotit'))
+ edit other
+ buf Xsomefile
+ call assert_equal('hello', &filetype)
+ call assert_true(exists('g:gotit'))
+ call delete('Xsomefile')
+endfunc
diff --git a/src/version.c b/src/version.c
index 774ac524c..20197c515 100644
--- a/src/version.c
+++ b/src/version.c
@@ -749,6 +749,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1754,
+/**/
1753,
/**/
1752,