Patch 8.2.1904
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".
Files:      src/buffer.c, src/ex_cmds.c, src/vim.h,
            src/testdir/test_buffer.vim


*** ../vim-8.2.1903/src/buffer.c        2020-10-24 20:49:37.490683063 +0200
--- src/buffer.c        2020-10-25 17:08:24.529220430 +0100
***************
*** 1974,1980 ****
      {
        vim_free(ffname);
        if (lnum != 0)
!           buflist_setfpos(buf, curwin, lnum, (colnr_T)0, FALSE);
  
        if ((flags & BLN_NOOPT) == 0)
            // copy the options now, if 'cpo' doesn't have 's' and not done
--- 1974,1981 ----
      {
        vim_free(ffname);
        if (lnum != 0)
!           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,2914 ****
      void
  buflist_setfpos(
      buf_T     *buf,
!     win_T     *win,
      linenr_T  lnum,
      colnr_T   col,
      int               copy_options)
--- 2909,2915 ----
      void
  buflist_setfpos(
      buf_T     *buf,
!     win_T     *win,           // may be NULL when using :badd
      linenr_T  lnum,
      colnr_T   col,
      int               copy_options)
***************
*** 2950,2956 ****
        wip->wi_fpos.lnum = lnum;
        wip->wi_fpos.col = col;
      }
!     if (copy_options)
      {
        // Save the window-specific option values.
        copy_winopt(&win->w_onebuf_opt, &wip->wi_opt);
--- 2951,2957 ----
        wip->wi_fpos.lnum = lnum;
        wip->wi_fpos.col = col;
      }
!     if (copy_options && win != NULL)
      {
        // Save the window-specific option values.
        copy_winopt(&win->w_onebuf_opt, &wip->wi_opt);
***************
*** 2997,3002 ****
--- 2998,3004 ----
  /*
   * 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,3009 ****
--- 3006,3012 ----
      static wininfo_T *
  find_wininfo(
      buf_T     *buf,
+     int               need_options,
      int               skip_diff_buffer UNUSED)
  {
      wininfo_T *wip;
***************
*** 3013,3030 ****
  #ifdef FEAT_DIFF
                && (!skip_diff_buffer || !wininfo_other_tab_diff(wip))
  #endif
!          )
            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 (wip == NULL)
      {
  #ifdef FEAT_DIFF
        if (skip_diff_buffer)
        {
            FOR_ALL_BUF_WININFO(buf, wip)
!               if (!wininfo_other_tab_diff(wip))
                    break;
        }
        else
--- 3016,3040 ----
  #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)
!                       && (!need_options || wip->wi_optset
!                           || (wip->wi_win != NULL
!                                            && wip->wi_win->w_buffer == buf)))
                    break;
        }
        else
***************
*** 3050,3056 ****
      clearFolding(curwin);
  #endif
  
!     wip = find_wininfo(buf, TRUE);
      if (wip != NULL && wip->wi_win != NULL
            && wip->wi_win != curwin && wip->wi_win->w_buffer == buf)
      {
--- 3060,3066 ----
      clearFolding(curwin);
  #endif
  
!     wip = find_wininfo(buf, TRUE, TRUE);
      if (wip != NULL && wip->wi_win != NULL
            && wip->wi_win != curwin && wip->wi_win->w_buffer == buf)
      {
***************
*** 3097,3103 ****
      wininfo_T *wip;
      static pos_T no_position = {1, 0, 0};
  
!     wip = find_wininfo(buf, FALSE);
      if (wip != NULL)
        return &(wip->wi_fpos);
      else
--- 3107,3113 ----
      wininfo_T *wip;
      static pos_T no_position = {1, 0, 0};
  
!     wip = find_wininfo(buf, FALSE, FALSE);
      if (wip != NULL)
        return &(wip->wi_fpos);
      else
*** ../vim-8.2.1903/src/ex_cmds.c       2020-10-25 15:02:47.955867035 +0100
--- src/ex_cmds.c       2020-10-25 16:52:04.391586525 +0100
***************
*** 2640,2646 ****
                    if (tlnum <= 0)
                        tlnum = 1L;
                }
!               (void)buflist_new(ffname, sfname, tlnum, BLN_LISTED);
                goto theend;
            }
            buf = buflist_new(ffname, sfname, 0L,
--- 2640,2649 ----
                    if (tlnum <= 0)
                        tlnum = 1L;
                }
!               // 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,
*** ../vim-8.2.1903/src/vim.h   2020-10-21 20:58:47.710889972 +0200
--- src/vim.h   2020-10-25 16:53:14.491433218 +0100
***************
*** 931,936 ****
--- 931,937 ----
  #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
*** ../vim-8.2.1903/src/testdir/test_buffer.vim 2020-10-25 16:18:23.434921227 
+0100
--- src/testdir/test_buffer.vim 2020-10-25 16:24:49.501572786 +0100
***************
*** 366,372 ****
    new SomeNewBuffer
    setlocal numberwidth=3
    wincmd p
!   badd SomeNewBuffer
    new SomeNewBuffer
    call assert_equal(3, &numberwidth)
    close
--- 366,372 ----
    new SomeNewBuffer
    setlocal numberwidth=3
    wincmd p
!   badd +1 SomeNewBuffer
    new SomeNewBuffer
    call assert_equal(3, &numberwidth)
    close
*** ../vim-8.2.1903/src/version.c       2020-10-25 16:18:23.434921227 +0100
--- src/version.c       2020-10-25 16:59:26.106566230 +0100
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     1904,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
128. You can access the Net -- via your portable and cellular phone.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202010251610.09PGAISA1331819%40masaka.moolenaar.net.

Raspunde prin e-mail lui