Skip to content

Commit

Permalink
patch 8.2.2596: :doautocmd may confuse scripts listening to WinEnter
Browse files Browse the repository at this point in the history
Problem:    :doautocmd may confuse scripts listening to WinEnter.
Solution:   Do the current buffer last. (closes #7958)
  • Loading branch information
brammool committed Mar 13, 2021
1 parent 9e813b3 commit 41cd803
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 5 deletions.
20 changes: 16 additions & 4 deletions src/autocmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1336,7 +1336,7 @@ do_doautocmd(
void
ex_doautoall(exarg_T *eap)
{
int retval;
int retval = OK;
aco_save_T aco;
buf_T *buf;
bufref_T bufref;
Expand All @@ -1353,7 +1353,8 @@ ex_doautoall(exarg_T *eap)
*/
FOR_ALL_BUFFERS(buf)
{
if (buf->b_ml.ml_mfp != NULL)
// Only do loaded buffers and skip the current buffer, it's done last.
if (buf->b_ml.ml_mfp != NULL && buf != curbuf)
{
// find a window for this buffer and save some values
aucmd_prepbuf(&aco, buf);
Expand All @@ -1363,22 +1364,31 @@ ex_doautoall(exarg_T *eap)
retval = do_doautocmd(arg, FALSE, &did_aucmd);

if (call_do_modelines && did_aucmd)
{
// Execute the modeline settings, but don't set window-local
// options if we are using the current window for another
// buffer.
do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
}

// restore the current window
aucmd_restbuf(&aco);

// stop if there is some error or buffer was deleted
if (retval == FAIL || !bufref_valid(&bufref))
{
retval = FAIL;
break;
}
}
}

// Execute autocommands for the current buffer last.
if (retval == OK)
{
do_doautocmd(arg, FALSE, &did_aucmd);
if (call_do_modelines && did_aucmd)
do_modelines(0);
}

check_cursor(); // just in case lines got deleted
}

Expand Down Expand Up @@ -2166,12 +2176,14 @@ apply_autocmds_group(
while (au_pending_free_buf != NULL)
{
buf_T *b = au_pending_free_buf->b_next;

vim_free(au_pending_free_buf);
au_pending_free_buf = b;
}
while (au_pending_free_win != NULL)
{
win_T *w = au_pending_free_win->w_next;

vim_free(au_pending_free_win);
au_pending_free_win = w;
}
Expand Down
10 changes: 9 additions & 1 deletion src/testdir/test_autocmd.vim
Original file line number Diff line number Diff line change
Expand Up @@ -2670,6 +2670,9 @@ func Test_autocmd_window()
%bw!
edit one.txt
tabnew two.txt
vnew three.txt
tabnew four.txt
tabprevious
let g:blist = []
augroup aucmd_win_test1
au!
Expand All @@ -2678,7 +2681,12 @@ func Test_autocmd_window()
augroup END

doautoall BufEnter
call assert_equal([['one.txt', 'autocmd'], ['two.txt', '']], g:blist)
call assert_equal([
\ ['one.txt', 'autocmd'],
\ ['two.txt', ''],
\ ['four.txt', 'autocmd'],
\ ['three.txt', ''],
\ ], g:blist)

augroup aucmd_win_test1
au!
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2596,
/**/
2595,
/**/
Expand Down

0 comments on commit 41cd803

Please sign in to comment.