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:
parent
70bcd7336f
commit
e13b9afe12
@ -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
|
||||||
/*
|
/*
|
||||||
|
@ -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())
|
||||||
|
@ -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())
|
||||||
|
11
src/fileio.c
11
src/fileio.c
@ -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())
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user