Mercurial > vim
changeset 1944:40a8e388692b v7.2.241
updated for version 7.2-241
author | vimboss |
---|---|
date | Wed, 29 Jul 2009 10:10:29 +0000 |
parents | 96276cc11d8e |
children | 9d6a886aceb2 |
files | src/fileio.c src/globals.h src/structs.h src/version.c |
diffstat | 4 files changed, 27 insertions(+), 2 deletions(-) [+] |
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
--- 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 /*
--- 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;