0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.0.0177: BufEnter autocommand not fired for a directory

Problem:    When opening a buffer on a directory and inside a try/catch then
            the BufEnter event is not triggered.
Solution:   Return NOTDONE from readfile() for a directory and deal with the
            three possible return values. (Justin M. Keyes, closes #1375,
            closes #1353)
This commit is contained in:
Bram Moolenaar 2017-01-13 22:01:02 +01:00
parent 70bcd7336f
commit e13b9afe12
7 changed files with 40 additions and 11 deletions

View File

@ -113,16 +113,19 @@ read_buffer(
* it can be changed there. */ * it can be changed there. */
if (!readonlymode && !bufempty()) if (!readonlymode && !bufempty())
changed(); changed();
else if (retval != FAIL) else if (retval == OK)
unchanged(curbuf, FALSE); unchanged(curbuf, FALSE);
#ifdef FEAT_AUTOCMD #ifdef FEAT_AUTOCMD
if (retval == OK)
{
# ifdef FEAT_EVAL # ifdef FEAT_EVAL
apply_autocmds_retval(EVENT_STDINREADPOST, NULL, NULL, FALSE, apply_autocmds_retval(EVENT_STDINREADPOST, NULL, NULL, FALSE,
curbuf, &retval); curbuf, &retval);
# else # else
apply_autocmds(EVENT_STDINREADPOST, NULL, NULL, FALSE, curbuf); apply_autocmds(EVENT_STDINREADPOST, NULL, NULL, FALSE, curbuf);
# endif # endif
}
#endif #endif
} }
return retval; return retval;
@ -294,7 +297,7 @@ open_buffer(
#endif #endif
) )
changed(); changed();
else if (retval != FAIL && !read_stdin && !read_fifo) else if (retval == OK && !read_stdin && !read_fifo)
unchanged(curbuf, FALSE); unchanged(curbuf, FALSE);
save_file_ff(curbuf); /* keep this fileformat */ save_file_ff(curbuf); /* keep this fileformat */
@ -328,7 +331,7 @@ open_buffer(
# endif # endif
#endif #endif
if (retval != FAIL) if (retval == OK)
{ {
#ifdef FEAT_AUTOCMD #ifdef FEAT_AUTOCMD
/* /*

View File

@ -1313,7 +1313,7 @@ do_filter(
if (otmp != NULL) if (otmp != NULL)
{ {
if (readfile(otmp, NULL, line2, (linenr_T)0, (linenr_T)MAXLNUM, if (readfile(otmp, NULL, line2, (linenr_T)0, (linenr_T)MAXLNUM,
eap, READ_FILTER) == FAIL) eap, READ_FILTER) != OK)
{ {
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
if (!aborting()) if (!aborting())

View File

@ -8857,7 +8857,7 @@ ex_read(exarg_T *eap)
eap->line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, 0); eap->line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, 0);
} }
if (i == FAIL) if (i != OK)
{ {
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
if (!aborting()) if (!aborting())

View File

@ -210,7 +210,7 @@ filemess(
* READ_KEEP_UNDO don't clear undo info or read it from a file * READ_KEEP_UNDO don't clear undo info or read it from a file
* READ_FIFO read from fifo/socket instead of a file * READ_FIFO read from fifo/socket instead of a file
* *
* return FAIL for failure, OK otherwise * return FAIL for failure, NOTDONE for directory (failure), or OK
*/ */
int int
readfile( readfile(
@ -450,13 +450,18 @@ readfile(
# endif # endif
) )
{ {
int retval = FAIL;
if (S_ISDIR(perm)) if (S_ISDIR(perm))
{
filemess(curbuf, fname, (char_u *)_("is a directory"), 0); filemess(curbuf, fname, (char_u *)_("is a directory"), 0);
retval = NOTDONE;
}
else else
filemess(curbuf, fname, (char_u *)_("is not a file"), 0); filemess(curbuf, fname, (char_u *)_("is not a file"), 0);
msg_end(); msg_end();
msg_scroll = msg_save; msg_scroll = msg_save;
return FAIL; return retval;
} }
#endif #endif
#if defined(MSWIN) #if defined(MSWIN)
@ -7136,7 +7141,7 @@ buf_reload(buf_T *buf, int orig_mode)
#endif #endif
if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0, if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
(linenr_T)0, (linenr_T)0,
(linenr_T)MAXLNUM, &ea, flags) == FAIL) (linenr_T)MAXLNUM, &ea, flags) != OK)
{ {
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
if (!aborting()) if (!aborting())

View File

@ -1519,7 +1519,7 @@ ml_recover(void)
line_count = pp->pb_pointer[idx].pe_line_count; line_count = pp->pb_pointer[idx].pe_line_count;
if (readfile(curbuf->b_ffname, NULL, lnum, if (readfile(curbuf->b_ffname, NULL, lnum,
pp->pb_pointer[idx].pe_old_lnum - 1, pp->pb_pointer[idx].pe_old_lnum - 1,
line_count, NULL, 0) == FAIL) line_count, NULL, 0) != OK)
cannot_open = TRUE; cannot_open = TRUE;
else else
lnum += line_count; lnum += line_count;

View File

@ -322,3 +322,22 @@ func Test_three_windows()
call delete('Xtestje2') call delete('Xtestje2')
call delete('Xtestje3') call delete('Xtestje3')
endfunc endfunc
func Test_BufEnter()
au! BufEnter
au Bufenter * let val = val . '+'
let g:val = ''
split NewFile
call assert_equal('+', g:val)
bwipe!
call assert_equal('++', g:val)
" Also get BufEnter when editing a directory
call mkdir('Xdir')
split Xdir
call assert_equal('+++', g:val)
bwipe!
call delete('Xdir', 'd')
au! BufEnter
endfunc

View File

@ -764,6 +764,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 */
/**/
177,
/**/ /**/
176, 176,
/**/ /**/