mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.2.2596: :doautocmd may confuse scripts listening to WinEnter
Problem: :doautocmd may confuse scripts listening to WinEnter. Solution: Do the current buffer last. (closes #7958)
This commit is contained in:
parent
9e813b3dea
commit
41cd80335c
@ -1336,7 +1336,7 @@ do_doautocmd(
|
|||||||
void
|
void
|
||||||
ex_doautoall(exarg_T *eap)
|
ex_doautoall(exarg_T *eap)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval = OK;
|
||||||
aco_save_T aco;
|
aco_save_T aco;
|
||||||
buf_T *buf;
|
buf_T *buf;
|
||||||
bufref_T bufref;
|
bufref_T bufref;
|
||||||
@ -1353,7 +1353,8 @@ ex_doautoall(exarg_T *eap)
|
|||||||
*/
|
*/
|
||||||
FOR_ALL_BUFFERS(buf)
|
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
|
// find a window for this buffer and save some values
|
||||||
aucmd_prepbuf(&aco, buf);
|
aucmd_prepbuf(&aco, buf);
|
||||||
@ -1363,21 +1364,30 @@ ex_doautoall(exarg_T *eap)
|
|||||||
retval = do_doautocmd(arg, FALSE, &did_aucmd);
|
retval = do_doautocmd(arg, FALSE, &did_aucmd);
|
||||||
|
|
||||||
if (call_do_modelines && did_aucmd)
|
if (call_do_modelines && did_aucmd)
|
||||||
{
|
|
||||||
// Execute the modeline settings, but don't set window-local
|
// Execute the modeline settings, but don't set window-local
|
||||||
// options if we are using the current window for another
|
// options if we are using the current window for another
|
||||||
// buffer.
|
// buffer.
|
||||||
do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
|
do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
|
||||||
}
|
|
||||||
|
|
||||||
// restore the current window
|
// restore the current window
|
||||||
aucmd_restbuf(&aco);
|
aucmd_restbuf(&aco);
|
||||||
|
|
||||||
// stop if there is some error or buffer was deleted
|
// stop if there is some error or buffer was deleted
|
||||||
if (retval == FAIL || !bufref_valid(&bufref))
|
if (retval == FAIL || !bufref_valid(&bufref))
|
||||||
|
{
|
||||||
|
retval = FAIL;
|
||||||
break;
|
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
|
check_cursor(); // just in case lines got deleted
|
||||||
}
|
}
|
||||||
@ -2166,12 +2176,14 @@ apply_autocmds_group(
|
|||||||
while (au_pending_free_buf != NULL)
|
while (au_pending_free_buf != NULL)
|
||||||
{
|
{
|
||||||
buf_T *b = au_pending_free_buf->b_next;
|
buf_T *b = au_pending_free_buf->b_next;
|
||||||
|
|
||||||
vim_free(au_pending_free_buf);
|
vim_free(au_pending_free_buf);
|
||||||
au_pending_free_buf = b;
|
au_pending_free_buf = b;
|
||||||
}
|
}
|
||||||
while (au_pending_free_win != NULL)
|
while (au_pending_free_win != NULL)
|
||||||
{
|
{
|
||||||
win_T *w = au_pending_free_win->w_next;
|
win_T *w = au_pending_free_win->w_next;
|
||||||
|
|
||||||
vim_free(au_pending_free_win);
|
vim_free(au_pending_free_win);
|
||||||
au_pending_free_win = w;
|
au_pending_free_win = w;
|
||||||
}
|
}
|
||||||
|
@ -2670,6 +2670,9 @@ func Test_autocmd_window()
|
|||||||
%bw!
|
%bw!
|
||||||
edit one.txt
|
edit one.txt
|
||||||
tabnew two.txt
|
tabnew two.txt
|
||||||
|
vnew three.txt
|
||||||
|
tabnew four.txt
|
||||||
|
tabprevious
|
||||||
let g:blist = []
|
let g:blist = []
|
||||||
augroup aucmd_win_test1
|
augroup aucmd_win_test1
|
||||||
au!
|
au!
|
||||||
@ -2678,7 +2681,12 @@ func Test_autocmd_window()
|
|||||||
augroup END
|
augroup END
|
||||||
|
|
||||||
doautoall BufEnter
|
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
|
augroup aucmd_win_test1
|
||||||
au!
|
au!
|
||||||
|
@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
2596,
|
||||||
/**/
|
/**/
|
||||||
2595,
|
2595,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user