mirror of
https://github.com/vim/vim.git
synced 2025-11-15 23:14:06 -05:00
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)
This commit is contained in:
28
src/fileio.c
28
src/fileio.c
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -748,6 +748,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1754,
|
||||
/**/
|
||||
1753,
|
||||
/**/
|
||||
|
||||
Reference in New Issue
Block a user