From ad272cd2d7ac6c9d28c2981169b779e146cbb5d6 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sun, 26 Jan 2020 10:21:28 -0500 Subject: vim-patch:8.1.1144: too strict checking of the 'spellfile' option Problem: Too strict checking of the 'spellfile' option. Solution: Allow for a path. https://github.com/vim/vim/commit/862f1e17eaf2b9c6617dfba31d8487cde462658d --- src/nvim/option.c | 19 +++++++++++++++++-- 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") -- cgit