From 25782a7ff4755daf16c2e1cb5e5f826b13b672ce Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 13 May 2018 18:05:33 +0200 Subject: patch 8.0.1836: buffer-local window options may not be recent Problem: Buffer-local window options may not be recent if the buffer is still open in another window. Solution: Copy the options from the window instead of the outdated window options. (Bjorn Linse, closes #2336) --- src/buffer.c | 17 ++++++++++++++- src/testdir/test_options.vim | 52 ++++++++++++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/buffer.c b/src/buffer.c index dd618337e..e3cbdac1e 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2895,8 +2895,23 @@ get_winopts(buf_T *buf) #endif wip = find_wininfo(buf, TRUE); - if (wip != NULL && wip->wi_optset) + if (wip != NULL && wip->wi_win != NULL + && wip->wi_win != curwin && wip->wi_win->w_buffer == buf) { + /* The buffer is currently displayed in the window: use the actual + * option values instead of the saved (possibly outdated) values. */ + win_T *wp = wip->wi_win; + + copy_winopt(&wp->w_onebuf_opt, &curwin->w_onebuf_opt); +#ifdef FEAT_FOLDING + curwin->w_fold_manual = wp->w_fold_manual; + curwin->w_foldinvalid = TRUE; + cloneFoldGrowArray(&wp->w_folds, &curwin->w_folds); +#endif + } + else if (wip != NULL && wip->wi_optset) + { + /* the buffer was displayed in the current window earlier */ copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt); #ifdef FEAT_FOLDING curwin->w_fold_manual = wip->wi_fold_manual; diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim index 8fa5f8b7b..167cb1ce0 100644 --- a/src/testdir/test_options.vim +++ b/src/testdir/test_options.vim @@ -348,3 +348,55 @@ func Test_backupskip() endif endfor endfunc + +func Test_copy_winopt() + set hidden + + " Test copy option from current buffer in window + split + enew + setlocal numberwidth=5 + wincmd w + call assert_equal(4,&numberwidth) + bnext + call assert_equal(5,&numberwidth) + bw! + call assert_equal(4,&numberwidth) + + " Test copy value from window that used to be display the buffer + split + enew + setlocal numberwidth=6 + bnext + wincmd w + call assert_equal(4,&numberwidth) + bnext + call assert_equal(6,&numberwidth) + bw! + + " Test that if buffer is current, don't use the stale cached value + " from the last time the buffer was displayed. + split + enew + setlocal numberwidth=7 + bnext + bnext + setlocal numberwidth=8 + wincmd w + call assert_equal(4,&numberwidth) + bnext + call assert_equal(8,&numberwidth) + bw! + + " Test value is not copied if window already has seen the buffer + enew + split + setlocal numberwidth=9 + bnext + setlocal numberwidth=10 + wincmd w + call assert_equal(4,&numberwidth) + bnext + call assert_equal(4,&numberwidth) + bw! +endfunc diff --git a/src/version.c b/src/version.c index 417fc7c1c..feffa38f2 100644 --- a/src/version.c +++ b/src/version.c @@ -761,6 +761,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1836, /**/ 1835, /**/ -- cgit v1.2.1