vim-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 vim/vim#747)

c3691332f7
This commit is contained in:
James McCoy 2016-12-08 09:42:32 -05:00
parent 49d2952658
commit d1473880bc
3 changed files with 38 additions and 3 deletions

View File

@ -187,6 +187,14 @@ struct bw_info {
static char *e_auchangedbuf = N_( static char *e_auchangedbuf = N_(
"E812: Autocommands changed buffer or buffer name"); "E812: Autocommands changed buffer or buffer name");
// 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 bool au_did_filetype INIT(= false);
void filemess(buf_T *buf, char_u *name, char_u *s, int attr) void filemess(buf_T *buf, char_u *name, char_u *s, int attr)
{ {
int msg_scroll_save; int msg_scroll_save;
@ -329,6 +337,8 @@ readfile (
int using_b_ffname; int using_b_ffname;
int using_b_fname; int using_b_fname;
au_did_filetype = false; // reset before triggering any autocommands
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 */
/* /*
@ -1961,12 +1971,18 @@ failed:
if (filtering) if (filtering)
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);
else 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, apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname,
FALSE, NULL, eap); FALSE, NULL, eap);
}
if (msg_scrolled == n) if (msg_scrolled == n)
msg_scroll = m; msg_scroll = m;
if (aborting()) /* autocmds may abort script processing */ if (aborting()) /* autocmds may abort script processing */
@ -6865,6 +6881,10 @@ 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;
} }

View File

@ -61,3 +61,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

View File

@ -689,7 +689,7 @@ static int included_patches[] = {
1757, 1757,
// 1756 NA // 1756 NA
1755, 1755,
// 1754, 1754,
1753, 1753,
// 1753, // 1753,
// 1752, // 1752,