Mercurial > vim
changeset 10575:01a5f64a7a20 v8.0.0177
patch 8.0.0177: BufEnter autocommand not fired for a directory
commit https://github.com/vim/vim/commit/e13b9afe1283f5ae43232b5992372a0eb570666c
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Fri, 13 Jan 2017 22:15:03 +0100 |
parents | 7eaa92b1da91 |
children | 05d22556d118 |
files | src/buffer.c src/ex_cmds.c src/ex_docmd.c src/fileio.c src/memline.c src/testdir/test_autocmd.vim src/version.c |
diffstat | 7 files changed, 40 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- 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 /*
--- 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())
--- 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())
--- 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())
--- 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;
--- 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