# HG changeset patch # User Christian Brabandt # Date 1484342103 -3600 # Node ID 01a5f64a7a20cce7f66a275429c71dc2b405e9b8 # Parent 7eaa92b1da9199ebe7c7e3cb7da5f2afe35d8a15 patch 8.0.0177: BufEnter autocommand not fired for a directory commit https://github.com/vim/vim/commit/e13b9afe1283f5ae43232b5992372a0eb570666c Author: Bram Moolenaar Date: Fri Jan 13 22:01:02 2017 +0100 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 --- a/src/buffer.c +++ b/src/buffer.c @@ -113,16 +113,19 @@ read_buffer( * 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 @@ open_buffer( #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 @@ open_buffer( # endif #endif - if (retval != FAIL) + if (retval == OK) { #ifdef FEAT_AUTOCMD /* diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -1313,7 +1313,7 @@ do_filter( 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 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -8857,7 +8857,7 @@ ex_read(exarg_T *eap) 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 --- a/src/fileio.c +++ b/src/fileio.c @@ -210,7 +210,7 @@ filemess( * 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 @@ readfile( # 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 @@ buf_reload(buf_T *buf, int orig_mode) #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 --- a/src/memline.c +++ b/src/memline.c @@ -1519,7 +1519,7 @@ ml_recover(void) 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 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -322,3 +322,22 @@ func Test_three_windows() 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 --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 177, +/**/ 176, /**/ 175,