Mercurial > vim
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; }