]> granicus.if.org Git - vim/commitdiff
patch 8.2.1904: still using default option values after using ":badd +1" v8.2.1904
authorBram Moolenaar <Bram@vim.org>
Sun, 25 Oct 2020 16:09:50 +0000 (17:09 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 25 Oct 2020 16:09:50 +0000 (17:09 +0100)
Problem:    Still using default option values after using ":badd +1".
Solution:   Find a window where options were set.  Don't set the window when
            using ":badd".

src/buffer.c
src/ex_cmds.c
src/testdir/test_buffer.vim
src/version.c
src/vim.h

index a1c789abdaf2cf85695628415738e54e891a16f9..318ce7f9885f80645ac106c3c71ad7776b4702e2 100644 (file)
@@ -1974,7 +1974,8 @@ buflist_new(
     {
        vim_free(ffname);
        if (lnum != 0)
-           buflist_setfpos(buf, curwin, lnum, (colnr_T)0, FALSE);
+           buflist_setfpos(buf, (flags & BLN_NOCURWIN) ? NULL : curwin,
+                                                     lnum, (colnr_T)0, FALSE);
 
        if ((flags & BLN_NOOPT) == 0)
            // copy the options now, if 'cpo' doesn't have 's' and not done
@@ -2908,7 +2909,7 @@ buflist_nr2name(
     void
 buflist_setfpos(
     buf_T      *buf,
-    win_T      *win,
+    win_T      *win,           // may be NULL when using :badd
     linenr_T   lnum,
     colnr_T    col,
     int                copy_options)
@@ -2950,7 +2951,7 @@ buflist_setfpos(
        wip->wi_fpos.lnum = lnum;
        wip->wi_fpos.col = col;
     }
-    if (copy_options)
+    if (copy_options && win != NULL)
     {
        // Save the window-specific option values.
        copy_winopt(&win->w_onebuf_opt, &wip->wi_opt);
@@ -2997,6 +2998,7 @@ wininfo_other_tab_diff(wininfo_T *wip)
 /*
  * Find info for the current window in buffer "buf".
  * If not found, return the info for the most recently used window.
+ * When "need_options" is TRUE skip entries where wi_optset is FALSE.
  * 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.
@@ -3004,6 +3006,7 @@ wininfo_other_tab_diff(wininfo_T *wip)
     static wininfo_T *
 find_wininfo(
     buf_T      *buf,
+    int                need_options,
     int                skip_diff_buffer UNUSED)
 {
     wininfo_T  *wip;
@@ -3013,18 +3016,25 @@ find_wininfo(
 #ifdef FEAT_DIFF
                && (!skip_diff_buffer || !wininfo_other_tab_diff(wip))
 #endif
-          )
+
+               && (!need_options || wip->wi_optset))
            break;
 
     // If no wininfo for curwin, use the first in the list (that doesn't have
     // 'diff' set and is in another tab page).
+    // If "need_options" is TRUE skip entries that don't have options set,
+    // unless the window is editing "buf", so we can copy from the window
+    // itself.
     if (wip == NULL)
     {
 #ifdef FEAT_DIFF
        if (skip_diff_buffer)
        {
            FOR_ALL_BUF_WININFO(buf, wip)
-               if (!wininfo_other_tab_diff(wip))
+               if (!wininfo_other_tab_diff(wip)
+                       && (!need_options || wip->wi_optset
+                           || (wip->wi_win != NULL
+                                            && wip->wi_win->w_buffer == buf)))
                    break;
        }
        else
@@ -3050,7 +3060,7 @@ get_winopts(buf_T *buf)
     clearFolding(curwin);
 #endif
 
-    wip = find_wininfo(buf, TRUE);
+    wip = find_wininfo(buf, TRUE, TRUE);
     if (wip != NULL && wip->wi_win != NULL
            && wip->wi_win != curwin && wip->wi_win->w_buffer == buf)
     {
@@ -3097,7 +3107,7 @@ buflist_findfpos(buf_T *buf)
     wininfo_T  *wip;
     static pos_T no_position = {1, 0, 0};
 
-    wip = find_wininfo(buf, FALSE);
+    wip = find_wininfo(buf, FALSE, FALSE);
     if (wip != NULL)
        return &(wip->wi_fpos);
     else
index a9be36a0c993b592d84e775ed8d0c0feb5fafc98..8ddf238d34ba4586c81b86814cdf37134eb28c22 100644 (file)
@@ -2640,7 +2640,10 @@ do_ecmd(
                    if (tlnum <= 0)
                        tlnum = 1L;
                }
-               (void)buflist_new(ffname, sfname, tlnum, BLN_LISTED);
+               // Add BLN_NOCURWIN to avoid a new wininfo items is assocated
+               // with the current window.
+               (void)buflist_new(ffname, sfname, tlnum,
+                                                   BLN_LISTED | BLN_NOCURWIN);
                goto theend;
            }
            buf = buflist_new(ffname, sfname, 0L,
index 2f0f31221add585ab3a746956b91fe2b0f710461..a743f1808cb2d1a93ac93600b3d489b90532f81d 100644 (file)
@@ -366,7 +366,7 @@ func Test_badd_options()
   new SomeNewBuffer
   setlocal numberwidth=3
   wincmd p
-  badd SomeNewBuffer
+  badd +1 SomeNewBuffer
   new SomeNewBuffer
   call assert_equal(3, &numberwidth)
   close
index 9725e9adcaec84848252152110891b2e1e0f1ee6..2d36060236971ec767670b6062c62faf05195633 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1904,
 /**/
     1903,
 /**/
index 64cf6d48da0e632577f19c1226f9ea96fcb3abac..4e40c813844ad98fb888754691b48ec39255e917 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -931,6 +931,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 #define BLN_NOOPT      16      // don't copy options to existing buffer
 #define BLN_DUMMY_OK   32      // also find an existing dummy buffer
 #define BLN_REUSE      64      // may re-use number from buf_reuse
+#define BLN_NOCURWIN   128     // buffer is not associated with curwin
 
 // Values for in_cinkeys()
 #define KEY_OPEN_FORW  0x101