# HG changeset patch # User vimboss # Date 1248862229 0 # Node ID 40a8e388692b53d36104e9c9b6ed351c01707308 # Parent 96276cc11d8e68ee320e0f61e20406dcb7a0b995 updated for version 7.2-241 diff --git a/src/fileio.c b/src/fileio.c --- 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 --- a/src/globals.h +++ b/src/globals.h @@ -541,6 +541,7 @@ EXTERN win_T *curwin; /* currently activ #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 --- 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 --- 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,