]> granicus.if.org Git - vim/commitdiff
updated for version 7.2-041 v7.2.041
authorBram Moolenaar <Bram@vim.org>
Sat, 15 Nov 2008 13:12:07 +0000 (13:12 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 15 Nov 2008 13:12:07 +0000 (13:12 +0000)
15 files changed:
src/buffer.c
src/ex_cmds.c
src/ex_cmds2.c
src/ex_docmd.c
src/ex_getln.c
src/if_sniff.c
src/main.c
src/netbeans.c
src/normal.c
src/popupmnu.c
src/proto/buffer.pro
src/proto/ex_cmds.pro
src/quickfix.c
src/version.c
src/window.c

index 7eb3d49a987194db30b474ef348d8bfd53b9b049..4104977d67b8167df0953d97b09ccb335bb67c16 100644 (file)
@@ -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;
index 5d382d18efbb64493e8f965a1e410b55781409ae..e3049fb0580f61c4934b21554cc049a6df680ae6 100644 (file)
@@ -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;
index ed3c45f6c78e3595abbf350e9c0c7d494919563f..2c0f80dfe747c69f7e3b5c00f2917f8bc4e5a50c 100644 (file)
@@ -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)
index 8d21ee1ebffed04452110ff63cab4505f5a51cd9..5a80a07c2203ddf312d9c7ee18e86d9697145a22 100644 (file)
@@ -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
index 8855f868ecf3f747cb01517ca2f50f7d0f6bf2c0..ac801eb8b3fa3edc9dd907e1bbdc28e98f73013a 100644 (file)
@@ -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);
index dea157446a5047a98142843bbca5362d58b2d972..34b01289638fc836101719d05f6970d91e1f6007 100644 (file)
@@ -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] */
 }
index 53f55c0be6ba539dc95ec40ec0fb6bcf6553e5af..17cab6d34803e0020a6d6ac93f7b2fd3373b41ca 100644 (file)
@@ -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)
            {
index 80a1b437557b4d045e421e9c2bc0c3b4f34687a4..19c365054f7bcdf24b12ed313f6c864ce802a9f5 100644 (file)
@@ -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;
index d33a636745e00c740172c4a6d29c9f5adb526ea7..b9071715a3b9376e3aad05328f0cf086fda94de1 100644 (file)
@@ -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;
index 10a5edf2784feede00a994c98dba537f95cf5e0f..5808ae19ed7e30063d443d8b34cbf07735e1767b 100644 (file)
@@ -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)
                    {
index 509f3900765036f2d0dd66a6ab0f62f68f587af6..e14ee8f4c99fdec8244b69e11f71a07d267f1685 100644 (file)
@@ -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));
index dced028c179062fd098af39e84b97f95d7df0922..1a15c88e75a39fd7983fc1a8dd3d462e38e95080 100644 (file)
@@ -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));
index ac11416c99e48d37729145e812625a54b03d7989..5c3ae381ee45596a684905f65ec2d6128f58d9f0 100644 (file)
@@ -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",
index 4686098e44ade87f7a337d4a29cf8a127e7545fa..d3ce62ae590fbbb363d04a7f80cd39bc817c09d7 100644 (file)
@@ -676,6 +676,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    41,
 /**/
     40,
 /**/
index 80cbfddba7570c7dc47c418d0ec5064e3981b253..2feb9e25b5c539b933e4e0efeddd4fb1a71644ae 100644 (file)
@@ -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;