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)
diff --git a/src/buffer.c b/src/buffer.c
index e77fc04..b79e277 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -113,16 +113,19 @@
* it can be changed there. */
if (!readonlymode && !bufempty())
changed();
- else if (retval != FAIL)
+ else if (retval == OK)
unchanged(curbuf, FALSE);
#ifdef FEAT_AUTOCMD
+ if (retval == OK)
+ {
# ifdef FEAT_EVAL
- apply_autocmds_retval(EVENT_STDINREADPOST, NULL, NULL, FALSE,
+ apply_autocmds_retval(EVENT_STDINREADPOST, NULL, NULL, FALSE,
curbuf, &retval);
# else
- apply_autocmds(EVENT_STDINREADPOST, NULL, NULL, FALSE, curbuf);
+ apply_autocmds(EVENT_STDINREADPOST, NULL, NULL, FALSE, curbuf);
# endif
+ }
#endif
}
return retval;
@@ -294,7 +297,7 @@
#endif
)
changed();
- else if (retval != FAIL && !read_stdin && !read_fifo)
+ else if (retval == OK && !read_stdin && !read_fifo)
unchanged(curbuf, FALSE);
save_file_ff(curbuf); /* keep this fileformat */
@@ -328,7 +331,7 @@
# endif
#endif
- if (retval != FAIL)
+ if (retval == OK)
{
#ifdef FEAT_AUTOCMD
/*
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 484a22c..00cac92 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1313,7 +1313,7 @@
if (otmp != NULL)
{
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 (!aborting())
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 134a488..295e539 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -8857,7 +8857,7 @@
eap->line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, 0);
}
- if (i == FAIL)
+ if (i != OK)
{
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
if (!aborting())
diff --git a/src/fileio.c b/src/fileio.c
index bcb8fef..aeb53b5 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -210,7 +210,7 @@
* READ_KEEP_UNDO don't clear undo info or read it from 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
readfile(
@@ -450,13 +450,18 @@
# endif
)
{
+ int retval = FAIL;
+
if (S_ISDIR(perm))
+ {
filemess(curbuf, fname, (char_u *)_("is a directory"), 0);
+ retval = NOTDONE;
+ }
else
filemess(curbuf, fname, (char_u *)_("is not a file"), 0);
msg_end();
msg_scroll = msg_save;
- return FAIL;
+ return retval;
}
#endif
#if defined(MSWIN)
@@ -7136,7 +7141,7 @@
#endif
if (readfile(buf->b_ffname, buf->b_fname, (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 (!aborting())
diff --git a/src/memline.c b/src/memline.c
index e3a4bdb..244e692 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -1519,7 +1519,7 @@
line_count = pp->pb_pointer[idx].pe_line_count;
if (readfile(curbuf->b_ffname, NULL, lnum,
pp->pb_pointer[idx].pe_old_lnum - 1,
- line_count, NULL, 0) == FAIL)
+ line_count, NULL, 0) != OK)
cannot_open = TRUE;
else
lnum += line_count;
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index 6ebfee4..566a07c 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -322,3 +322,22 @@
call delete('Xtestje2')
call delete('Xtestje3')
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
diff --git a/src/version.c b/src/version.c
index c7e47fa..a0887dd 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 177,
+/**/
176,
/**/
175,