0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 9.0.0965: using one window for executing autocommands is insufficient

Problem:    Using one window for executing autocommands is insufficient.
Solution:   Use up to five windows for executing autocommands.
This commit is contained in:
Bram Moolenaar
2022-11-28 18:51:43 +00:00
parent 74a694dbe2
commit e76062c078
28 changed files with 451 additions and 260 deletions

View File

@@ -4598,21 +4598,29 @@ qf_update_buffer(qf_info_T *qi, qfline_T *old_last)
// autocommands may cause trouble
incr_quickfix_busy();
if (old_last == NULL)
// set curwin/curbuf to buf and save a few things
aucmd_prepbuf(&aco, buf);
qf_update_win_titlevar(qi);
qf_fill_buffer(qf_get_curlist(qi), buf, old_last, qf_winid);
++CHANGEDTICK(buf);
int do_fill = TRUE;
if (old_last == NULL)
{
(void)qf_win_pos_update(qi, 0);
// set curwin/curbuf to buf and save a few things
aucmd_prepbuf(&aco, buf);
if (curbuf != buf)
do_fill = FALSE; // failed to find a window for "buf"
}
// restore curwin/curbuf and a few other things
aucmd_restbuf(&aco);
if (do_fill)
{
qf_update_win_titlevar(qi);
qf_fill_buffer(qf_get_curlist(qi), buf, old_last, qf_winid);
++CHANGEDTICK(buf);
if (old_last == NULL)
{
(void)qf_win_pos_update(qi, 0);
// restore curwin/curbuf and a few other things
aucmd_restbuf(&aco);
}
}
// Only redraw when added lines are visible. This avoids flickering
@@ -6395,12 +6403,15 @@ vgr_process_files(
// need to be done (again). But not the window-local
// options!
aucmd_prepbuf(&aco, buf);
if (curbuf == buf)
{
#if defined(FEAT_SYN_HL)
apply_autocmds(EVENT_FILETYPE, buf->b_p_ft,
apply_autocmds(EVENT_FILETYPE, buf->b_p_ft,
buf->b_fname, TRUE, buf);
#endif
do_modelines(OPT_NOWIN);
aucmd_restbuf(&aco);
do_modelines(OPT_NOWIN);
aucmd_restbuf(&aco);
}
}
}
}
@@ -6593,40 +6604,43 @@ load_dummy_buffer(
// set curwin/curbuf to buf and save a few things
aucmd_prepbuf(&aco, newbuf);
// Need to set the filename for autocommands.
(void)setfname(curbuf, fname, NULL, FALSE);
// Create swap file now to avoid the ATTENTION message.
check_need_swap(TRUE);
// Remove the "dummy" flag, otherwise autocommands may not
// work.
curbuf->b_flags &= ~BF_DUMMY;
newbuf_to_wipe.br_buf = NULL;
readfile_result = readfile(fname, NULL,
(linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM,
NULL, READ_NEW | READ_DUMMY);
--newbuf->b_locked;
if (readfile_result == OK
&& !got_int
&& !(curbuf->b_flags & BF_NEW))
if (curbuf == newbuf)
{
failed = FALSE;
if (curbuf != newbuf)
// Need to set the filename for autocommands.
(void)setfname(curbuf, fname, NULL, FALSE);
// Create swap file now to avoid the ATTENTION message.
check_need_swap(TRUE);
// Remove the "dummy" flag, otherwise autocommands may not
// work.
curbuf->b_flags &= ~BF_DUMMY;
newbuf_to_wipe.br_buf = NULL;
readfile_result = readfile(fname, NULL,
(linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM,
NULL, READ_NEW | READ_DUMMY);
--newbuf->b_locked;
if (readfile_result == OK
&& !got_int
&& !(curbuf->b_flags & BF_NEW))
{
// Bloody autocommands changed the buffer! Can happen when
// using netrw and editing a remote file. Use the current
// buffer instead, delete the dummy one after restoring the
// window stuff.
set_bufref(&newbuf_to_wipe, newbuf);
newbuf = curbuf;
failed = FALSE;
if (curbuf != newbuf)
{
// Bloody autocommands changed the buffer! Can happen when
// using netrw and editing a remote file. Use the current
// buffer instead, delete the dummy one after restoring the
// window stuff.
set_bufref(&newbuf_to_wipe, newbuf);
newbuf = curbuf;
}
}
// restore curwin/curbuf and a few other things
aucmd_restbuf(&aco);
}
// restore curwin/curbuf and a few other things
aucmd_restbuf(&aco);
if (newbuf_to_wipe.br_buf != NULL && bufref_valid(&newbuf_to_wipe))
wipe_buffer(newbuf_to_wipe.br_buf, FALSE);