diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-10-25 17:09:50 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-10-25 17:09:50 +0100 |
commit | 89b693e5627715cde080c3580c7b641c9bf0c06a (patch) | |
tree | ea55eb7287428a2c3e6246c9a12c14d2306e7ec5 | |
parent | 37e4e03c67dacfc4a065e95492ffc4c7f490b44b (diff) | |
download | vim-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.c | 24 | ||||
-rw-r--r-- | src/ex_cmds.c | 5 | ||||
-rw-r--r-- | src/testdir/test_buffer.vim | 2 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 1 |
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, @@ -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 |