summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-10-25 17:09:50 +0100
committerBram Moolenaar <Bram@vim.org>2020-10-25 17:09:50 +0100
commit89b693e5627715cde080c3580c7b641c9bf0c06a (patch)
treeea55eb7287428a2c3e6246c9a12c14d2306e7ec5
parent37e4e03c67dacfc4a065e95492ffc4c7f490b44b (diff)
downloadvim-git-89b693e5627715cde080c3580c7b641c9bf0c06a.tar.gz
patch 8.2.1904: still using default option values after using ":badd +1"v8.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".
-rw-r--r--src/buffer.c24
-rw-r--r--src/ex_cmds.c5
-rw-r--r--src/testdir/test_buffer.vim2
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h1
5 files changed, 25 insertions, 9 deletions
diff --git a/src/buffer.c b/src/buffer.c
index a1c789abd..318ce7f98 100644
--- 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
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index a9be36a0c..8ddf238d3 100644
--- 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,
diff --git a/src/testdir/test_buffer.vim b/src/testdir/test_buffer.vim
index 2f0f31221..a743f1808 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 9725e9adc..2d3606023 100644
--- 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,
diff --git a/src/vim.h b/src/vim.h
index 64cf6d48d..4e40c8138 100644
--- 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