aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-10-22 11:34:09 +0800
committerGitHub <noreply@github.com>2024-10-22 11:34:09 +0800
commit1b9dafa67ba98e360444832e1fddce1e96acc1d6 (patch)
treeb5466c491cdc91a73904fc870ae69c9fb637552f
parentf663243e95f488b8f4224bdae2697ddac21d0ffb (diff)
downloadrneovim-1b9dafa67ba98e360444832e1fddce1e96acc1d6.tar.gz
rneovim-1b9dafa67ba98e360444832e1fddce1e96acc1d6.tar.bz2
rneovim-1b9dafa67ba98e360444832e1fddce1e96acc1d6.zip
fix(options): fix :setglobal not working for 'spelloptions' (#30894)
-rw-r--r--src/nvim/option.c1
-rw-r--r--src/nvim/optionstr.c13
-rw-r--r--test/functional/ui/spell_spec.lua48
-rw-r--r--test/old/testdir/gen_opt_test.vim1
4 files changed, 59 insertions, 4 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 0aa9cf4d93..2e6d317778 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -5325,6 +5325,7 @@ void buf_copy_options(buf_T *buf, int flags)
COPY_OPT_SCTX(buf, BV_SPL);
buf->b_s.b_p_spo = xstrdup(p_spo);
COPY_OPT_SCTX(buf, BV_SPO);
+ buf->b_s.b_p_spo_flags = spo_flags;
buf->b_p_inde = xstrdup(p_inde);
COPY_OPT_SCTX(buf, BV_INDE);
buf->b_p_indk = xstrdup(p_indk);
diff --git a/src/nvim/optionstr.c b/src/nvim/optionstr.c
index 8e488d2539..b560275de7 100644
--- a/src/nvim/optionstr.c
+++ b/src/nvim/optionstr.c
@@ -2116,7 +2116,7 @@ const char *did_set_spellfile(optset_T *args)
// When there is a window for this buffer in which 'spell'
// is set load the wordlists.
- if ((!valid_spellfile(*varp))) {
+ if (!valid_spellfile(*varp)) {
return e_invarg;
}
return did_set_spell_option();
@@ -2139,8 +2139,15 @@ const char *did_set_spelllang(optset_T *args)
const char *did_set_spelloptions(optset_T *args)
{
win_T *win = (win_T *)args->os_win;
- if (opt_strings_flags(win->w_s->b_p_spo, p_spo_values, &(win->w_s->b_p_spo_flags),
- true) != OK) {
+ int opt_flags = args->os_flags;
+ const char *val = args->os_newval.string.data;
+
+ if (!(opt_flags & OPT_LOCAL)
+ && opt_strings_flags(val, p_spo_values, &spo_flags, true) != OK) {
+ return e_invarg;
+ }
+ if (!(opt_flags & OPT_GLOBAL)
+ && opt_strings_flags(val, p_spo_values, &win->w_s->b_p_spo_flags, true) != OK) {
return e_invarg;
}
return NULL;
diff --git a/test/functional/ui/spell_spec.lua b/test/functional/ui/spell_spec.lua
index f0fa47ebfb..c3e01e5b6a 100644
--- a/test/functional/ui/spell_spec.lua
+++ b/test/functional/ui/spell_spec.lua
@@ -408,4 +408,52 @@ describe("'spell'", function()
{5:-- VISUAL LINE --} |
]])
end)
+
+ it("global value works properly for 'spelloptions'", function()
+ screen:try_resize(43, 3)
+ exec('set spell')
+ -- :setglobal applies to future buffers but not current buffer
+ exec('setglobal spelloptions=camel')
+ insert('Here is TheCamelWord being spellchecked')
+ screen:expect([[
+ Here is {1:TheCamelWord} being spellchecke^d |
+ {0:~ }|
+ |
+ ]])
+ exec('enew')
+ insert('There is TheCamelWord being spellchecked')
+ screen:expect([[
+ There is TheCamelWord being spellchecke^d |
+ {0:~ }|
+ |
+ ]])
+ -- :setlocal applies to current buffer but not future buffers
+ exec('setlocal spelloptions=')
+ screen:expect([[
+ There is {1:TheCamelWord} being spellchecke^d |
+ {0:~ }|
+ |
+ ]])
+ exec('enew')
+ insert('What is TheCamelWord being spellchecked')
+ screen:expect([[
+ What is TheCamelWord being spellchecke^d |
+ {0:~ }|
+ |
+ ]])
+ -- :set applies to both current buffer and future buffers
+ exec('set spelloptions=')
+ screen:expect([[
+ What is {1:TheCamelWord} being spellchecke^d |
+ {0:~ }|
+ |
+ ]])
+ exec('enew')
+ insert('Where is TheCamelWord being spellchecked')
+ screen:expect([[
+ Where is {1:TheCamelWord} being spellchecke^d |
+ {0:~ }|
+ |
+ ]])
+ end)
end)
diff --git a/test/old/testdir/gen_opt_test.vim b/test/old/testdir/gen_opt_test.vim
index 85f5e33dcf..27e709b19d 100644
--- a/test/old/testdir/gen_opt_test.vim
+++ b/test/old/testdir/gen_opt_test.vim
@@ -56,7 +56,6 @@ let skip_setglobal_reasons = #{
\ shiftwidth: 'TODO: fix missing error handling for setglobal',
\ sidescrolloff: 'TODO: fix missing error handling for setglobal',
\ signcolumn: 'TODO(nvim): fix missing error handling for setglobal',
- \ spelloptions: 'TODO(nvim): fix missing error handling for setglobal',
\ tabstop: 'TODO: fix missing error handling for setglobal',
\ termwinkey: 'TODO: fix missing error handling for setglobal',
\ termwinsize: 'TODO: fix missing error handling for setglobal',