summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buffer.c76
-rw-r--r--src/ex_cmds.c22
-rw-r--r--src/ex_cmds2.c4
-rw-r--r--src/ex_docmd.c5
-rw-r--r--src/ex_getln.c2
-rw-r--r--src/if_sniff.c3
-rw-r--r--src/main.c2
-rw-r--r--src/netbeans.c6
-rw-r--r--src/normal.c2
-rw-r--r--src/popupmnu.c2
-rw-r--r--src/proto/buffer.pro2
-rw-r--r--src/proto/ex_cmds.pro2
-rw-r--r--src/quickfix.c11
-rw-r--r--src/version.c2
-rw-r--r--src/window.c3
15 files changed, 107 insertions, 37 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 7eb3d49a9..4104977d6 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -33,7 +33,7 @@ static char_u *buflist_match __ARGS((regprog_T *prog, buf_T *buf));
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, forceit)
#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, copy_options)
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
index 5d382d18e..e3049fb05 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3052,7 +3052,8 @@ getfile(fnum, ffname, sfname, setpm, lnum, forceit)
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, newlnum, flags)
{
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, newlnum, flags)
/* 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
index ed3c45f6c..2c0f80dfe 100644
--- 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
index 8d21ee1eb..5a80a07c2 100644
--- 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
index 8855f868e..ac801eb8b 100644
--- 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
index dea157446..34b012896 100644
--- 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
index 53f55c0be..17cab6d34 100644
--- 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
index 80a1b4375..19c365054 100644
--- 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
index d33a63674..b9071715a 100644
--- 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
index 10a5edf27..5808ae19e 100644
--- 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
index 509f39007..e14ee8f4c 100644
--- a/src/proto/buffer.pro
+++ b/src/proto/buffer.pro
@@ -33,7 +33,7 @@ buf_T *setaltfname __ARGS((char_u *ffname, char_u *sfname, linenr_T lnum));
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
index dced028c1..1a15c88e7 100644
--- 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
index ac11416c9..5c3ae381e 100644
--- 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
index 4686098e4..d3ce62ae5 100644
--- 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
index 80cbfddba..2feb9e25b 100644
--- 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;