diff options
-rw-r--r-- | src/nvim/option.c | 19 | ||||
-rw-r--r-- | src/nvim/testdir/test_spell.vim | 5 |
2 files changed, 22 insertions, 2 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c index 9168509aa8..52742c8b64 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -2538,6 +2538,18 @@ bool valid_spellang(const char_u *val) return valid_name(val, ".-_,"); } +/// Return true if "val" is a valid 'spellfile' value. +static bool valid_spellfile(const char_u *val) + FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT +{ + for (const char_u *s = val; *s != NUL; s++) { + if (!vim_isfilec(*s) && *s != ',') { + return false; + } + } + return true; +} + /// Handle string options that need some action to perform when changed. /// Returns NULL for success, or an error message for an error. static char_u * @@ -3049,10 +3061,13 @@ ambw_end: || varp == &(curwin->w_s->b_p_spf)) { // When 'spelllang' or 'spellfile' is set and there is a window for this // buffer in which 'spell' is set load the wordlists. - if (!valid_spellang(*varp)) { + const bool is_spellfile = varp == &(curwin->w_s->b_p_spf); + + if ((is_spellfile && !valid_spellfile(*varp)) + || (!is_spellfile && !valid_spellang(*varp))) { errmsg = e_invarg; } else { - errmsg = did_set_spell_option(varp == &(curwin->w_s->b_p_spf)); + errmsg = did_set_spell_option(is_spellfile); } } else if (varp == &(curwin->w_s->b_p_spc)) { // When 'spellcapcheck' is set compile the regexp program. diff --git a/src/nvim/testdir/test_spell.vim b/src/nvim/testdir/test_spell.vim index 098cd957ae..94789d6ea3 100644 --- a/src/nvim/testdir/test_spell.vim +++ b/src/nvim/testdir/test_spell.vim @@ -392,6 +392,11 @@ func Test_zz_sal_and_addition() call assert_equal("elekwint", SecondSpellWord()) endfunc +func Test_spellfile_value() + set spellfile=Xdir/Xtest.latin1.add + set spellfile=Xdir/Xtest.utf-8.add,Xtest_other.add +endfunc + func Test_region_error() messages clear call writefile(["/regions=usgbnz", "elequint/0"], "Xtest.latin1.add") |