# HG changeset patch # User vimboss # Date 1226754727 0 # Node ID 734d5bdae499eb2fa3f818e843efd9727e7f69f3 # Parent 0e4fa55d20e025a70e3e6b82abc58333902c45db updated for version 7.2-041 diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -33,7 +33,7 @@ static char_u *buflist_match __ARGS((reg static char_u *fname_match __ARGS((regprog_T *prog, char_u *name)); #endif static void buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options)); -static wininfo_T *find_wininfo __ARGS((buf_T *buf)); +static wininfo_T *find_wininfo __ARGS((buf_T *buf, int skip_diff_buffer)); #ifdef UNIX static buf_T *buflist_findname_stat __ARGS((char_u *ffname, struct stat *st)); static int otherfile_buf __ARGS((buf_T *buf, char_u *ffname, struct stat *stp)); @@ -1093,7 +1093,7 @@ do_buffer(action, start, dir, count, for #endif setpcmark(); retval = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, - forceit ? ECMD_FORCEIT : 0); + forceit ? ECMD_FORCEIT : 0, curwin); /* * do_ecmd() may create a new buffer, then we have to delete @@ -1316,7 +1316,7 @@ set_curbuf(buf, action) setpcmark(); if (!cmdmod.keepalt) curwin->w_alt_fnum = curbuf->b_fnum; /* remember alternate file */ - buflist_altfpos(); /* remember curpos */ + buflist_altfpos(curwin); /* remember curpos */ #ifdef FEAT_VISUAL /* Don't restart Select mode after switching to another buffer. */ @@ -2404,22 +2404,70 @@ buflist_setfpos(buf, win, lnum, col, cop return; } +#ifdef FEAT_DIFF +static int wininfo_other_tab_diff __ARGS((wininfo_T *wip)); + +/* + * Return TRUE when "wip" has 'diff' set and the diff is only for another tab + * page. That's because a diff is local to a tab page. + */ + static int +wininfo_other_tab_diff(wip) + wininfo_T *wip; +{ + win_T *wp; + + if (wip->wi_opt.wo_diff) + { + for (wp = firstwin; wp != NULL; wp = wp->w_next) + /* return FALSE when it's a window in the current tab page, thus + * the buffer was in diff mode here */ + if (wip->wi_win == wp) + return FALSE; + return TRUE; + } + return FALSE; +} +#endif + /* * Find info for the current window in buffer "buf". * If not found, return the info for the most recently used window. + * When "skip_diff_buffer" is TRUE avoid windows with 'diff' set that is in + * another tab page. * Returns NULL when there isn't any info. */ +/*ARGSUSED*/ static wininfo_T * -find_wininfo(buf) +find_wininfo(buf, skip_diff_buffer) buf_T *buf; + int skip_diff_buffer; { wininfo_T *wip; for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next) - if (wip->wi_win == curwin) + if (wip->wi_win == curwin +#ifdef FEAT_DIFF + && (!skip_diff_buffer || !wininfo_other_tab_diff(wip)) +#endif + ) break; - if (wip == NULL) /* if no fpos for curwin, use the first in the list */ - wip = buf->b_wininfo; + + /* If no wininfo for curwin, use the first in the list (that doesn't have + * 'diff' set and is in another tab page). */ + if (wip == NULL) + { +#ifdef FEAT_DIFF + if (skip_diff_buffer) + { + for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next) + if (!wininfo_other_tab_diff(wip)) + break; + } + else +#endif + wip = buf->b_wininfo; + } return wip; } @@ -2440,7 +2488,7 @@ get_winopts(buf) clearFolding(curwin); #endif - wip = find_wininfo(buf); + wip = find_wininfo(buf, TRUE); if (wip != NULL && wip->wi_optset) { copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt); @@ -2472,7 +2520,7 @@ buflist_findfpos(buf) wininfo_T *wip; static pos_T no_position = {1, 0}; - wip = find_wininfo(buf); + wip = find_wininfo(buf, FALSE); if (wip != NULL) return &(wip->wi_fpos); else @@ -2793,14 +2841,14 @@ buflist_slash_adjust() #endif /* - * Set alternate cursor position for current window. + * Set alternate cursor position for the current buffer and window "win". * Also save the local window option values. */ void -buflist_altfpos() +buflist_altfpos(win) + win_T *win; { - buflist_setfpos(curbuf, curwin, curwin->w_cursor.lnum, - curwin->w_cursor.col, TRUE); + buflist_setfpos(curbuf, win, win->w_cursor.lnum, win->w_cursor.col, TRUE); } /* @@ -4492,7 +4540,7 @@ do_arg_all(count, forceit, keep_tabs) ECMD_ONE, ((P_HID(curwin->w_buffer) || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0) - + ECMD_OLDBUF); + + ECMD_OLDBUF, curwin); #ifdef FEAT_AUTOCMD if (use_firstwin) ++autocmd_no_leave; diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -3052,7 +3052,8 @@ getfile(fnum, ffname, sfname, setpm, lnu retval = 0; /* it's in the same file */ } else if (do_ecmd(fnum, ffname, sfname, NULL, lnum, - (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0)) == OK) + (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0), + curwin) == OK) retval = -1; /* opened another file */ else retval = 1; /* error encountered */ @@ -3085,17 +3086,21 @@ theend: * ECMD_OLDBUF: use existing buffer if it exists * ECMD_FORCEIT: ! used for Ex command * ECMD_ADDBUF: don't edit, just add to buffer list + * oldwin: Should be "curwin" when editing a new buffer in the current + * window, NULL when splitting the window first. When not NULL info + * of the previous buffer for "oldwin" is stored. * * return FAIL for failure, OK otherwise */ int -do_ecmd(fnum, ffname, sfname, eap, newlnum, flags) +do_ecmd(fnum, ffname, sfname, eap, newlnum, flags, oldwin) int fnum; char_u *ffname; char_u *sfname; exarg_T *eap; /* can be NULL! */ linenr_T newlnum; int flags; + win_T *oldwin; { int other_file; /* TRUE if editing another file */ int oldbuf; /* TRUE if using existing buffer */ @@ -3267,7 +3272,8 @@ do_ecmd(fnum, ffname, sfname, eap, newln { if (!cmdmod.keepalt) curwin->w_alt_fnum = curbuf->b_fnum; - buflist_altfpos(); + if (oldwin != NULL) + buflist_altfpos(oldwin); } if (fnum) @@ -3371,7 +3377,7 @@ do_ecmd(fnum, ffname, sfname, eap, newln /* close the link to the current buffer */ u_sync(FALSE); - close_buffer(curwin, curbuf, + close_buffer(oldwin, curbuf, (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD); #ifdef FEAT_AUTOCMD @@ -5609,7 +5615,13 @@ ex_help(eap) */ alt_fnum = curbuf->b_fnum; (void)do_ecmd(0, NULL, NULL, NULL, ECMD_LASTL, - ECMD_HIDE + ECMD_SET_HELP); + ECMD_HIDE + ECMD_SET_HELP, +#ifdef FEAT_WINDOWS + NULL /* buffer is still open, don't store info */ +#else + curwin +#endif + ); if (!cmdmod.keepalt) curwin->w_alt_fnum = alt_fnum; empty_fnum = curbuf->b_fnum; diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -2132,8 +2132,8 @@ do_argfile(eap, argn) * argument index. */ if (do_ecmd(0, alist_name(&ARGLIST[curwin->w_arg_idx]), NULL, eap, ECMD_LAST, - (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0) + - (eap->forceit ? ECMD_FORCEIT : 0)) == FAIL) + (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0) + + (eap->forceit ? ECMD_FORCEIT : 0), curwin) == FAIL) curwin->w_arg_idx = old_arg_idx; /* like Vi: set the mark where the cursor is in the file. */ else if (eap->cmdidx != CMD_argdo) diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -7488,7 +7488,8 @@ do_exedit(eap, old_curwin) /* ":new" or ":tabnew" without argument: edit an new empty buffer */ setpcmark(); (void)do_ecmd(0, NULL, NULL, eap, ECMD_ONE, - ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0)); + ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0), + old_curwin == NULL ? curwin : NULL); } else if ((eap->cmdidx != CMD_split #ifdef FEAT_VERTSPLIT @@ -7525,7 +7526,7 @@ do_exedit(eap, old_curwin) #ifdef FEAT_LISTCMDS + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0 ) #endif - ) == FAIL) + , old_curwin == NULL ? curwin : NULL) == FAIL) { /* Editing the file failed. If the window was split, close it. */ #ifdef FEAT_WINDOWS diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -6051,7 +6051,7 @@ ex_window() cmdwin_type = '-'; /* Create the command-line buffer empty. */ - (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE); + (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL); (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE); set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL); set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL); diff --git a/src/if_sniff.c b/src/if_sniff.c --- a/src/if_sniff.c +++ b/src/if_sniff.c @@ -1114,7 +1114,8 @@ vi_open_file(fname) char *fname; { ++no_wait_return; - do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF); + do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF, + curwin); curbuf->b_sniff = TRUE; --no_wait_return; /* [ex_docmd.c] */ } diff --git a/src/main.c b/src/main.c --- a/src/main.c +++ b/src/main.c @@ -2588,7 +2588,7 @@ edit_buffers(parmp) # endif (void)do_ecmd(0, arg_idx < GARGCOUNT ? alist_name(&GARGLIST[arg_idx]) : NULL, - NULL, NULL, ECMD_LASTL, ECMD_HIDE); + NULL, NULL, ECMD_LASTL, ECMD_HIDE, curwin); # ifdef HAS_SWAP_EXISTS_ACTION if (swap_exists_did_quit) { diff --git a/src/netbeans.c b/src/netbeans.c --- a/src/netbeans.c +++ b/src/netbeans.c @@ -1795,7 +1795,7 @@ nb_do_cmd( buf->displayname = NULL; netbeansReadFile = 0; /* don't try to open disk file */ - do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF); + do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF, curwin); netbeansReadFile = 1; buf->bufp = curbuf; maketitle(); @@ -1960,7 +1960,7 @@ nb_do_cmd( netbeansReadFile = 0; /* don't try to open disk file */ do_ecmd(0, (char_u *)buf->displayname, 0, 0, ECMD_ONE, - ECMD_HIDE + ECMD_OLDBUF); + ECMD_HIDE + ECMD_OLDBUF, curwin); netbeansReadFile = 1; buf->bufp = curbuf; maketitle(); @@ -1979,7 +1979,7 @@ nb_do_cmd( vim_free(buf->displayname); buf->displayname = nb_unquote(args, NULL); do_ecmd(0, (char_u *)buf->displayname, NULL, NULL, ECMD_ONE, - ECMD_HIDE + ECMD_OLDBUF); + ECMD_HIDE + ECMD_OLDBUF, curwin); buf->bufp = curbuf; buf->initDone = TRUE; doupdate = 1; diff --git a/src/normal.c b/src/normal.c --- a/src/normal.c +++ b/src/normal.c @@ -6050,7 +6050,7 @@ nv_gotofile(cap) autowrite(curbuf, FALSE); setpcmark(); (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LAST, - P_HID(curbuf) ? ECMD_HIDE : 0); + P_HID(curbuf) ? ECMD_HIDE : 0, curwin); if (cap->nchar == 'F' && lnum >= 0) { curwin->w_cursor.lnum = lnum; diff --git a/src/popupmnu.c b/src/popupmnu.c --- a/src/popupmnu.c +++ b/src/popupmnu.c @@ -573,7 +573,7 @@ pum_set_selected(n, repeat) { /* Don't want to sync undo in the current buffer. */ ++no_u_sync; - res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0); + res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0, NULL); --no_u_sync; if (res == OK) { diff --git a/src/proto/buffer.pro b/src/proto/buffer.pro --- a/src/proto/buffer.pro +++ b/src/proto/buffer.pro @@ -33,7 +33,7 @@ buf_T *setaltfname __ARGS((char_u *ffnam char_u *getaltfname __ARGS((int errmsg)); int buflist_add __ARGS((char_u *fname, int flags)); void buflist_slash_adjust __ARGS((void)); -void buflist_altfpos __ARGS((void)); +void buflist_altfpos __ARGS((win_T *win)); int otherfile __ARGS((char_u *ffname)); void buf_setino __ARGS((buf_T *buf)); void fileinfo __ARGS((int fullname, int shorthelp, int dont_truncate)); diff --git a/src/proto/ex_cmds.pro b/src/proto/ex_cmds.pro --- a/src/proto/ex_cmds.pro +++ b/src/proto/ex_cmds.pro @@ -27,7 +27,7 @@ void ex_wnext __ARGS((exarg_T *eap)); void do_wqall __ARGS((exarg_T *eap)); int not_writing __ARGS((void)); int getfile __ARGS((int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum, int forceit)); -int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags)); +int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags, win_T *oldwin)); void ex_append __ARGS((exarg_T *eap)); void ex_change __ARGS((exarg_T *eap)); void ex_z __ARGS((exarg_T *eap)); diff --git a/src/quickfix.c b/src/quickfix.c --- a/src/quickfix.c +++ b/src/quickfix.c @@ -1420,6 +1420,7 @@ qf_jump(qi, dir, errornr, forceit) win_T *win; win_T *altwin; #endif + win_T *oldwin = curwin; int print_message = TRUE; int len; #ifdef FEAT_FOLDING @@ -1744,7 +1745,8 @@ qf_jump(qi, dir, errornr, forceit) } else ok = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1, - ECMD_HIDE + ECMD_SET_HELP); + ECMD_HIDE + ECMD_SET_HELP, + oldwin == curwin ? curwin : NULL); } else ok = buflist_getfile(qf_ptr->qf_fnum, @@ -2267,6 +2269,7 @@ ex_copen(eap) win_T *win; tabpage_T *prevtab = curtab; buf_T *qf_buf; + win_T *oldwin = curwin; if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow) { @@ -2326,14 +2329,16 @@ ex_copen(eap) win->w_llist->qf_refcount++; } + if (oldwin != curwin) + oldwin = NULL; /* don't store info when in another window */ if (qf_buf != NULL) /* Use the existing quickfix buffer */ (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE, - ECMD_HIDE + ECMD_OLDBUF); + ECMD_HIDE + ECMD_OLDBUF, oldwin); else { /* Create a new quickfix buffer */ - (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE); + (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin); /* switch off 'swapfile' */ set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL); set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix", 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 */ /**/ + 41, +/**/ 40, /**/ 39, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -531,7 +531,8 @@ wingotofile: # ifdef FEAT_SCROLLBIND curwin->w_p_scb = FALSE; # endif - (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, ECMD_HIDE); + (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, + ECMD_HIDE, NULL); if (nchar == 'F' && lnum >= 0) { curwin->w_cursor.lnum = lnum;