neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 1b9dafa67ba98e360444832e1fddce1e96acc1d6
parent f663243e95f488b8f4224bdae2697ddac21d0ffb
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Tue, 22 Oct 2024 11:34:09 +0800

fix(options): fix :setglobal not working for 'spelloptions' (#30894)


Diffstat:
Msrc/nvim/option.c | 1+
Msrc/nvim/optionstr.c | 13++++++++++---
Mtest/functional/ui/spell_spec.lua | 48++++++++++++++++++++++++++++++++++++++++++++++++
Mtest/old/testdir/gen_opt_test.vim | 1-
4 files changed, 59 insertions(+), 4 deletions(-)

diff --git 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 @@ -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 @@ -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 @@ -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',