diff --git a/src/nvim/option.c b/src/nvim/option.c index 3bd1ce217e..0f95974cb4 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -1727,13 +1727,25 @@ do_set ( } if (flags & P_FLAGLIST) { - /* Remove flags that appear twice. */ - for (s = newval; *s; ++s) - if ((!(flags & P_COMMA) || *s != ',') - && vim_strchr(s + 1, *s) != NULL) { - STRMOVE(s, s + 1); - --s; + // Remove flags that appear twice. + for (s = newval; *s; s++) { + // if options have P_FLAGLIST and P_ONECOMMA such as + // 'whichwrap' + if (flags & P_ONECOMMA) { + if (*s != ',' && *(s + 1) == ',' + && vim_strchr(s + 2, *s) != NULL) { + // Remove the duplicated value and the next comma. + STRMOVE(s, s + 2); + s -= 2; + } + } else { + if ((!(flags & P_COMMA) || *s != ',') + && vim_strchr(s + 1, *s) != NULL) { + STRMOVE(s, s + 1); + s--; + } } + } } if (save_arg != NULL) /* number for 'whichwrap' */ diff --git a/src/nvim/testdir/test_alot.vim b/src/nvim/testdir/test_alot.vim index 60f264fb3f..156604051d 100644 --- a/src/nvim/testdir/test_alot.vim +++ b/src/nvim/testdir/test_alot.vim @@ -10,6 +10,7 @@ source test_expr_utf8.vim source test_feedkeys.vim source test_cmdline.vim source test_menu.vim +source test_options.vim source test_popup.vim source test_regexp_utf8.vim source test_syn_attr.vim diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim new file mode 100644 index 0000000000..cceb180189 --- /dev/null +++ b/src/nvim/testdir/test_options.vim @@ -0,0 +1,40 @@ +" Test for options + +function! Test_whichwrap() + set whichwrap=b,s + call assert_equal('b,s', &whichwrap) + + set whichwrap+=h,l + call assert_equal('b,s,h,l', &whichwrap) + + set whichwrap+=h,l + call assert_equal('b,s,h,l', &whichwrap) + + set whichwrap+=h,l + call assert_equal('b,s,h,l', &whichwrap) + + set whichwrap& +endfunction + +function! Test_options() + let caught = 'ok' + try + options + catch + let caught = v:throwpoint . "\n" . v:exception + endtry + call assert_equal('ok', caught) + + " close option-window + close +endfunction + +function! Test_path_keep_commas() + " Test that changing 'path' keeps two commas. + set path=foo,,bar + set path-=bar + set path+=bar + call assert_equal('foo,,bar', &path) + + set path& +endfunction diff --git a/src/nvim/version.c b/src/nvim/version.c index c1459466a2..08eff53d1e 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -268,7 +268,7 @@ static int included_patches[] = { // 2177, // 2176 NA // 2175, - // 2174, + 2174, // 2173, // 2172, // 2171,