]> granicus.if.org Git - vim/commitdiff
patch 7.4.1754 v7.4.1754
authorBram Moolenaar <Bram@vim.org>
Wed, 20 Apr 2016 10:49:49 +0000 (12:49 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 20 Apr 2016 10:49:49 +0000 (12:49 +0200)
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)

src/fileio.c
src/testdir/test_syntax.vim
src/version.c

index ed8d45ba1d3d0b5ac7b9db6eb5584d1e35cb5f64..0ddd079280991b5e3f51523b87c27b63d66a3080 100644 (file)
@@ -141,6 +141,18 @@ static void vim_settempdir(char_u *tempdir);
 #endif
 #ifdef FEAT_AUTOCMD
 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
@@ -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;
 }
 
index 297e8359a397aaa62f601e9fcf5cb4a5cdf1ba1f..4b88fe33fcde4433ec8add635ecd23d43485a34c 100644 (file)
@@ -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
index 774ac524c216a88cc7612ff2aa9dc7675e5bd892..20197c51545d10e36cee4e97b5db1597d7e591c8 100644 (file)
@@ -748,6 +748,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1754,
 /**/
     1753,
 /**/