changeset 22711:92f221ad267c v8.2.1904

patch 8.2.1904: still using default option values after using ":badd +1" Commit: https://github.com/vim/vim/commit/89b693e5627715cde080c3580c7b641c9bf0c06a Author: Bram Moolenaar <Bram@vim.org> Date: Sun Oct 25 17:09:50 2020 +0100 patch 8.2.1904: still using default option values after using ":badd +1" 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".
author Bram Moolenaar <Bram@vim.org>
date Sun, 25 Oct 2020 17:15:03 +0100
parents d54b1d74bd6c
children 82bfe1464940
files src/buffer.c src/ex_cmds.c src/testdir/test_buffer.vim src/version.c src/vim.h
diffstat 5 files changed, 25 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -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
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -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,
--- a/src/testdir/test_buffer.vim
+++ b/src/testdir/test_buffer.vim
@@ -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
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1904,
+/**/
     1903,
 /**/
     1902,
--- a/src/vim.h
+++ b/src/vim.h
@@ -931,6 +931,7 @@ extern int (*dyn_libintl_wputenv)(const 
 #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