diff src/fileio.c @ 1944:40a8e388692b v7.2.241

updated for version 7.2-241
author vimboss
date Wed, 29 Jul 2009 10:10:29 +0000
parents 3eb34a777f49
children ce6bc4bf2b87
line wrap: on
line diff
--- 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