0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

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)
This commit is contained in:
Bram Moolenaar
2018-05-13 18:05:33 +02:00
parent 2290b1f8aa
commit 25782a7ff4
3 changed files with 70 additions and 1 deletions

View File

@@ -2895,8 +2895,23 @@ get_winopts(buf_T *buf)
#endif #endif
wip = find_wininfo(buf, TRUE); 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); copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt);
#ifdef FEAT_FOLDING #ifdef FEAT_FOLDING
curwin->w_fold_manual = wip->wi_fold_manual; curwin->w_fold_manual = wip->wi_fold_manual;

View File

@@ -348,3 +348,55 @@ func Test_backupskip()
endif endif
endfor endfor
endfunc 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

View File

@@ -761,6 +761,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1836,
/**/ /**/
1835, 1835,
/**/ /**/