diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-04-20 12:49:49 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-04-20 12:49:49 +0200 |
commit | c3691332f72169c486066200c0f3935418364900 (patch) | |
tree | cc88c3f0eeb5d4b2b145a20a148e8307e3ffa43c /src/fileio.c | |
parent | c020042083b9c0a4e932b562c3bef97c76328e18 (diff) | |
download | vim-c3691332f72169c486066200c0f3935418364900.zip |
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)
Diffstat (limited to 'src/fileio.c')
-rw-r--r-- | src/fileio.c | 28 |
1 files changed, 28 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; } |