aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-11-03 16:52:20 +0800
committerzeertzjq <zeertzjq@outlook.com>2024-11-03 16:58:22 +0800
commit981fa11c91d3655828b4f70ccf7d079d917d5b6b (patch)
treefc0e5caebf9d3af58106092d27d3c0f20d4212ef
parent99acc9de559a2ea3b9de2b418dbcae774d1d9a75 (diff)
downloadrneovim-981fa11c91d3655828b4f70ccf7d079d917d5b6b.tar.gz
rneovim-981fa11c91d3655828b4f70ccf7d079d917d5b6b.tar.bz2
rneovim-981fa11c91d3655828b4f70ccf7d079d917d5b6b.zip
vim-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: vim/vim#15981 https://github.com/vim/vim/commit/46dcd84d242db6b053cb5b777c896cede9ad9b27
-rw-r--r--src/nvim/optionstr.c6
-rw-r--r--test/old/testdir/test_ins_complete.vim40
2 files changed, 46 insertions, 0 deletions
diff --git a/src/nvim/optionstr.c b/src/nvim/optionstr.c
index 307c4ae79f..48423a1779 100644
--- a/src/nvim/optionstr.c
+++ b/src/nvim/optionstr.c
@@ -655,6 +655,9 @@ const char *did_set_backupcopy(optset_T *args)
if (opt_flags & OPT_LOCAL) {
bkc = buf->b_p_bkc;
flags = &buf->b_bkc_flags;
+ } else if (!(opt_flags & OPT_GLOBAL)) {
+ // When using :set, clear the local flags.
+ buf->b_bkc_flags = 0;
}
if ((opt_flags & OPT_LOCAL) && *bkc == NUL) {
@@ -1070,6 +1073,9 @@ const char *did_set_completeopt(optset_T *args FUNC_ATTR_UNUSED)
if (args->os_flags & OPT_LOCAL) {
cot = buf->b_p_cot;
flags = &buf->b_cot_flags;
+ } else if (!(args->os_flags & OPT_GLOBAL)) {
+ // When using :set, clear the local flags.
+ buf->b_cot_flags = 0;
}
if (check_opt_strings(cot, p_cot_values, true) != OK) {
diff --git a/test/old/testdir/test_ins_complete.vim b/test/old/testdir/test_ins_complete.vim
index 8e2a7c4631..01695d5be5 100644
--- a/test/old/testdir/test_ins_complete.vim
+++ b/test/old/testdir/test_ins_complete.vim
@@ -950,6 +950,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\<C-X>\<C-N>bz\<C-Y>", '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\<C-X>\<C-N>\<C-X>\<C-Z>", '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\<C-X>\<C-N>\<C-X>\<C-Z>", '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\<C-X>\<C-N>\<C-X>\<C-Z>", 'tnix')
+ call assert_equal('foo', getline('.'))
+ bwipe!
+
set completeopt&
endfunc