# HG changeset patch # User Christian Brabandt # Date 1730621709 -3600 # Node ID 5006b62d5072ae2bd0199738869523d5adbf1ccc # Parent 56e749acdce865ede224a7c88dee926e9b3b67a9 patch 9.1.0832: :set doesn't work for 'cot' and 'bkc' after :setlocal Commit: https://github.com/vim/vim/commit/46dcd84d242db6b053cb5b777c896cede9ad9b27 Author: zeertzjq Date: Sun Nov 3 09:10:50 2024 +0100 patch 9.1.0832: :set doesn't work for 'cot' and 'bkc' after :setlocal Problem: :set doesn't work for 'cot' and 'bkc' after :setlocal. Solution: clear the local flags when using :set (zeertzjq). closes: #15981 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt diff --git a/src/optionstr.c b/src/optionstr.c --- a/src/optionstr.c +++ b/src/optionstr.c @@ -1146,6 +1146,9 @@ did_set_backupcopy(optset_T *args) bkc = curbuf->b_p_bkc; flags = &curbuf->b_bkc_flags; } + else if (!(args->os_flags & OPT_GLOBAL)) + // When using :set, clear the local flags. + curbuf->b_bkc_flags = 0; if ((args->os_flags & OPT_LOCAL) && *bkc == NUL) // make the local value empty: use the global value @@ -1619,6 +1622,9 @@ did_set_completeopt(optset_T *args UNUSE cot = curbuf->b_p_cot; flags = &curbuf->b_cot_flags; } + else if (!(args->os_flags & OPT_GLOBAL)) + // When using :set, clear the local flags. + curbuf->b_cot_flags = 0; if (check_opt_strings(cot, p_cot_values, TRUE) != OK) return e_invalid_argument; diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -875,6 +875,46 @@ func Test_completeopt_buffer_local() call assert_equal('menu', &completeopt) call assert_equal('menu', &g:completeopt) + new | only + call setline(1, ['foofoo', 'foobar', 'foobaz', '']) + set completeopt& + setlocal completeopt=menu,fuzzy,noinsert + setglobal completeopt=menu,longest + call assert_equal('menu,fuzzy,noinsert', &completeopt) + call assert_equal('menu,fuzzy,noinsert', &l:completeopt) + call assert_equal('menu,longest', &g:completeopt) + call feedkeys("Gccf\\bz\", 'tnix') + call assert_equal('foobaz', getline('.')) + setlocal bufhidden=wipe + new | only! + call setline(1, ['foofoo', 'foobar', 'foobaz', '']) + call assert_equal('menu,longest', &completeopt) + call assert_equal('menu,longest', &g:completeopt) + call assert_equal('', &l:completeopt) + call feedkeys("Gccf\\\\", 'tnix') + call assert_equal('foo', getline('.')) + bwipe! + + new | only + call setline(1, ['foofoo', 'foobar', 'foobaz', '']) + set completeopt& + setlocal completeopt=menu,fuzzy,noinsert + set completeopt=menu,longest + call assert_equal('menu,longest', &completeopt) + call assert_equal('menu,longest', &g:completeopt) + call assert_equal('', &l:completeopt) + call feedkeys("Gccf\\\\", 'tnix') + call assert_equal('foo', getline('.')) + setlocal bufhidden=wipe + new | only! + call setline(1, ['foofoo', 'foobar', 'foobaz', '']) + call assert_equal('menu,longest', &completeopt) + call assert_equal('menu,longest', &g:completeopt) + call assert_equal('', &l:completeopt) + call feedkeys("Gccf\\\\", 'tnix') + call assert_equal('foo', getline('.')) + bwipe! + set completeopt& endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 832, +/**/ 831, /**/ 830,