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
|
#endif
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
|
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
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -305,6 +317,10 @@ readfile(
|
|||||||
int using_b_fname;
|
int using_b_fname;
|
||||||
#endif
|
#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 */
|
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,
|
apply_autocmds_exarg(EVENT_FILTERREADPOST, NULL, sfname,
|
||||||
FALSE, curbuf, eap);
|
FALSE, curbuf, eap);
|
||||||
else if (newfile)
|
else if (newfile)
|
||||||
|
{
|
||||||
apply_autocmds_exarg(EVENT_BUFREADPOST, NULL, sfname,
|
apply_autocmds_exarg(EVENT_BUFREADPOST, NULL, sfname,
|
||||||
FALSE, curbuf, eap);
|
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
|
else
|
||||||
apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname,
|
apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname,
|
||||||
FALSE, NULL, eap);
|
FALSE, NULL, eap);
|
||||||
@@ -9537,6 +9562,9 @@ BYPASS_AU:
|
|||||||
if (event == EVENT_BUFWIPEOUT && buf != NULL)
|
if (event == EVENT_BUFWIPEOUT && buf != NULL)
|
||||||
aubuflocal_remove(buf);
|
aubuflocal_remove(buf);
|
||||||
|
|
||||||
|
if (retval == OK && event == EVENT_FILETYPE)
|
||||||
|
au_did_filetype = TRUE;
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,3 +65,18 @@ func Test_syn_iskeyword()
|
|||||||
|
|
||||||
quit!
|
quit!
|
||||||
endfunc
|
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[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1754,
|
||||||
/**/
|
/**/
|
||||||
1753,
|
1753,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user