summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fileio.c24
-rw-r--r--src/globals.h1
-rw-r--r--src/structs.h2
-rw-r--r--src/version.c2
4 files changed, 27 insertions, 2 deletions
diff --git a/src/fileio.c b/src/fileio.c
index b17806bde..1e7db3391 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -8420,6 +8420,10 @@ aucmd_prepbuf(aco, buf)
if (aucmd_win == NULL)
win = curwin;
}
+ if (win == NULL && aucmd_win_used)
+ /* Strange recursive autocommand, fall back to using the current
+ * window. Expect a few side effects... */
+ win = curwin;
aco->save_curwin = curwin;
aco->save_curbuf = curbuf;
@@ -8428,6 +8432,7 @@ aucmd_prepbuf(aco, buf)
/* There is a window for "buf" in the current tab page, make it the
* curwin. This is preferred, it has the least side effects (esp. if
* "buf" is curbuf). */
+ aco->use_aucmd_win = FALSE;
curwin = win;
}
else
@@ -8436,9 +8441,20 @@ aucmd_prepbuf(aco, buf)
* effects, insert it in a the current tab page.
* Anything related to a window (e.g., setting folds) may have
* unexpected results. */
+ aco->use_aucmd_win = TRUE;
+ aucmd_win_used = TRUE;
aucmd_win->w_buffer = buf;
++buf->b_nwindows;
win_init_empty(aucmd_win); /* set cursor and topline to safe values */
+ vim_free(aucmd_win->w_localdir);
+ aucmd_win->w_localdir = NULL;
+
+ /* Make sure w_localdir and globaldir are NULL to avoid a chdir() in
+ * win_enter_ext(). */
+ aucmd_win->w_localdir = NULL;
+ aco->globaldir = globaldir;
+ globaldir = NULL;
+
#ifdef FEAT_WINDOWS
/* Split the current window, put the aucmd_win in the upper half.
@@ -8472,7 +8488,7 @@ aucmd_restbuf(aco)
int dummy;
#endif
- if (aco->new_curwin == aucmd_win)
+ if (aco->use_aucmd_win)
{
--curbuf->b_nwindows;
#ifdef FEAT_WINDOWS
@@ -8499,6 +8515,7 @@ aucmd_restbuf(aco)
/* Remove the window and frame from the tree of frames. */
(void)winframe_remove(curwin, &dummy, NULL);
win_remove(curwin, NULL);
+ aucmd_win_used = FALSE;
last_status(FALSE); /* may need to remove last status line */
restore_snapshot(SNAP_AUCMD_IDX, FALSE);
(void)win_comp_pos(); /* recompute window positions */
@@ -8517,6 +8534,9 @@ aucmd_restbuf(aco)
#endif
curbuf = curwin->w_buffer;
+ vim_free(globaldir);
+ globaldir = aco->globaldir;
+
/* the buffer contents may have changed */
check_cursor();
if (curwin->w_topline > curbuf->b_ml.ml_line_count)
@@ -8541,7 +8561,7 @@ aucmd_restbuf(aco)
#endif
{
/* Restore the buffer which was previously edited by curwin, if
- * it was chagned, we are still the same window and the buffer is
+ * it was changed, we are still the same window and the buffer is
* valid. */
if (curwin == aco->new_curwin
&& curbuf != aco->new_curbuf
diff --git a/src/globals.h b/src/globals.h
index 8f373f69f..2ff31740e 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -541,6 +541,7 @@ EXTERN win_T *curwin; /* currently active window */
#ifdef FEAT_AUTOCMD
EXTERN win_T *aucmd_win; /* window used in aucmd_prepbuf() */
+EXTERN int aucmd_win_used INIT(= FALSE); /* aucmd_win is being used */
#endif
/*
diff --git a/src/structs.h b/src/structs.h
index 658e098e1..137352d95 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -2288,9 +2288,11 @@ typedef struct
{
buf_T *save_curbuf; /* saved curbuf */
#ifdef FEAT_AUTOCMD
+ int use_aucmd_win; /* using aucmd_win */
win_T *save_curwin; /* saved curwin */
win_T *new_curwin; /* new curwin */
buf_T *new_curbuf; /* new curbuf */
+ char_u *globaldir; /* saved value of globaldir */
#endif
} aco_save_T;
diff --git a/src/version.c b/src/version.c
index ffaaa3086..2b2431bc8 100644
--- a/src/version.c
+++ b/src/version.c
@@ -677,6 +677,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 241,
+/**/
240,
/**/
239,