diff options
author | Bram Moolenaar <Bram@vim.org> | 2009-06-16 14:01:43 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2009-06-16 14:01:43 +0000 |
commit | 746ebd3b6a2ad53dc0caf0872e7895d0cab966e1 (patch) | |
tree | 7eb48e9b5ebdd7e17e79db2418bca9ddde158b0e /src/fileio.c | |
parent | 8b38e2416c1c56e38fa85ad048a4e1a3df851a43 (diff) | |
download | vim-git-746ebd3b6a2ad53dc0caf0872e7895d0cab966e1.tar.gz |
updated for version 7.2-203v7.2.203
Diffstat (limited to 'src/fileio.c')
-rw-r--r-- | src/fileio.c | 183 |
1 files changed, 118 insertions, 65 deletions
diff --git a/src/fileio.c b/src/fileio.c index ad7670d2f..cb839b8b9 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -8365,7 +8365,7 @@ ex_doautoall(eap) /* Execute the modeline settings, but don't set window-local * options if we are using the current window for another buffer. */ - do_modelines(aco.save_curwin == NULL ? OPT_NOWIN : 0); + do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0); /* restore the current window */ aucmd_restbuf(&aco); @@ -8381,8 +8381,8 @@ ex_doautoall(eap) /* * Prepare for executing autocommands for (hidden) buffer "buf". - * Search a window for the current buffer. Save the cursor position and - * screen offset. + * Search for a visible window containing the current buffer. If there isn't + * one then use "aucmd_win". * Set "curbuf" and "curwin" to match "buf". * When FEAT_AUTOCMD is not defined another version is used, see below. */ @@ -8392,8 +8392,9 @@ aucmd_prepbuf(aco, buf) buf_T *buf; /* new curbuf */ { win_T *win; - - aco->new_curbuf = buf; +#ifdef FEAT_WINDOWS + int save_ea; +#endif /* Find a window that is for the new buffer */ if (buf == curbuf) /* be quick when buf is curbuf */ @@ -8407,42 +8408,53 @@ aucmd_prepbuf(aco, buf) win = NULL; #endif - /* - * Prefer to use an existing window for the buffer, it has the least side - * effects (esp. if "buf" is curbuf). - * Otherwise, use curwin for "buf". It might make some items in the - * window invalid. At least save the cursor and topline. - */ + /* Allocate "aucmd_win" when needed. If this fails (out of memory) fall + * back to using the current window. */ + if (win == NULL && aucmd_win == NULL) + { + win_alloc_aucmd_win(); + if (aucmd_win == NULL) + win = curwin; + } + + aco->save_curwin = curwin; + aco->save_curbuf = curbuf; if (win != NULL) { - /* there is a window for "buf", make it the curwin */ - aco->save_curwin = curwin; + /* 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). */ curwin = win; - aco->save_buf = win->w_buffer; - aco->new_curwin = win; } else { - /* there is no window for "buf", use curwin */ - aco->save_curwin = NULL; - aco->save_buf = curbuf; - --curbuf->b_nwindows; + /* There is no window for "buf", use "aucmd_win". To minimize the side + * effects, insert it in a the current tab page. + * Anything related to a window (e.g., setting folds) may have + * unexpected results. */ + curwin = aucmd_win; curwin->w_buffer = buf; ++buf->b_nwindows; - /* save cursor and topline, set them to safe values */ - aco->save_cursor = curwin->w_cursor; - curwin->w_cursor.lnum = 1; - curwin->w_cursor.col = 0; - aco->save_topline = curwin->w_topline; - curwin->w_topline = 1; -#ifdef FEAT_DIFF - aco->save_topfill = curwin->w_topfill; - curwin->w_topfill = 0; +#ifdef FEAT_WINDOWS + /* Split the current window, put the aucmd_win in the upper half. */ + make_snapshot(SNAP_AUCMD_IDX); + save_ea = p_ea; + p_ea = FALSE; + (void)win_split_ins(0, WSP_TOP, aucmd_win, 0); + (void)win_comp_pos(); /* recompute window positions */ + p_ea = save_ea; +#endif + /* set cursor and topline to safe values */ + curwin_init(); +#ifdef FEAT_VERTSPLIT + curwin->w_wincol = 0; + curwin->w_width = Columns; #endif } - curbuf = buf; + aco->new_curwin = curwin; + aco->new_curbuf = curbuf; } /* @@ -8454,21 +8466,86 @@ aucmd_prepbuf(aco, buf) aucmd_restbuf(aco) aco_save_T *aco; /* structure holding saved values */ { - if (aco->save_curwin != NULL) +#ifdef FEAT_WINDOWS + int dummy; +#endif + + if (aco->new_curwin == aucmd_win) + { + --curbuf->b_nwindows; +#ifdef FEAT_WINDOWS + /* Find "aucmd_win", it can't be closed, but it may be in another tab + * page. */ + if (curwin != aucmd_win) + { + tabpage_T *tp; + win_T *wp; + + FOR_ALL_TAB_WINDOWS(tp, wp) + { + if (wp == aucmd_win) + { + if (tp != curtab) + goto_tabpage_tp(tp); + win_goto(aucmd_win); + break; + } + } + } + + /* Remove the window and frame from the tree of frames. */ + (void)winframe_remove(curwin, &dummy, NULL); + win_remove(curwin, NULL); + last_status(FALSE); /* may need to remove last status line */ + restore_snapshot(SNAP_AUCMD_IDX, FALSE); + (void)win_comp_pos(); /* recompute window positions */ + + if (win_valid(aco->save_curwin)) + curwin = aco->save_curwin; + else + /* Hmm, original window disappeared. Just use the first one. */ + curwin = firstwin; +# ifdef FEAT_EVAL + vars_clear(&aucmd_win->w_vars.dv_hashtab); /* free all w: variables */ +# endif +#else + curwin = aco->save_curwin; +#endif + curbuf = curwin->w_buffer; + + /* the buffer contents may have changed */ + check_cursor(); + if (curwin->w_topline > curbuf->b_ml.ml_line_count) + { + curwin->w_topline = curbuf->b_ml.ml_line_count; +#ifdef FEAT_DIFF + curwin->w_topfill = 0; +#endif + } +#if defined(FEAT_GUI) + /* Hide the scrollbars from the aucmd_win and update. */ + gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_LEFT], FALSE); + gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_RIGHT], FALSE); + gui_may_update_scrollbars(); +#endif + } + else { /* restore curwin */ #ifdef FEAT_WINDOWS if (win_valid(aco->save_curwin)) #endif { - /* restore the buffer which was previously edited by curwin, if - * it's still the same window and it's valid */ + /* Restore the buffer which was previously edited by curwin, if + * it was chagned, we are still the same window and the buffer is + * valid. */ if (curwin == aco->new_curwin - && buf_valid(aco->save_buf) - && aco->save_buf->b_ml.ml_mfp != NULL) + && curbuf != aco->new_curbuf + && buf_valid(aco->new_curbuf) + && aco->new_curbuf->b_ml.ml_mfp != NULL) { --curbuf->b_nwindows; - curbuf = aco->save_buf; + curbuf = aco->new_curbuf; curwin->w_buffer = curbuf; ++curbuf->b_nwindows; } @@ -8477,34 +8554,6 @@ aucmd_restbuf(aco) curbuf = curwin->w_buffer; } } - else - { - /* restore buffer for curwin if it still exists and is loaded */ - if (buf_valid(aco->save_buf) && aco->save_buf->b_ml.ml_mfp != NULL) - { - --curbuf->b_nwindows; - curbuf = aco->save_buf; - curwin->w_buffer = curbuf; - ++curbuf->b_nwindows; - curwin->w_cursor = aco->save_cursor; - check_cursor(); - /* check topline < line_count, in case lines got deleted */ - if (aco->save_topline <= curbuf->b_ml.ml_line_count) - { - curwin->w_topline = aco->save_topline; -#ifdef FEAT_DIFF - curwin->w_topfill = aco->save_topfill; -#endif - } - else - { - curwin->w_topline = curbuf->b_ml.ml_line_count; -#ifdef FEAT_DIFF - curwin->w_topfill = 0; -#endif - } - } - } } static int autocmd_nested = FALSE; @@ -9419,9 +9468,11 @@ aucmd_prepbuf(aco, buf) aco_save_T *aco; /* structure to save values in */ buf_T *buf; /* new curbuf */ { - aco->save_buf = curbuf; + aco->save_curbuf = curbuf; + --curbuf->b_nwindows; curbuf = buf; curwin->w_buffer = buf; + ++curbuf->b_nwindows; } /* @@ -9432,8 +9483,10 @@ aucmd_prepbuf(aco, buf) aucmd_restbuf(aco) aco_save_T *aco; /* structure holding saved values */ { - curbuf = aco->save_buf; + --curbuf->b_nwindows; + curbuf = aco->save_curbuf; curwin->w_buffer = curbuf; + ++curbuf->b_nwindows; } #endif /* FEAT_AUTOCMD */ |