patch 9.1.0783: 'spell' option setting has problems
Problem: 'spell' option setting has problems
Solution: correctly check for comma for 'spellfile' option,
remove unnecessary checks, refactor slightly (Milly)
closes: #15873
Signed-off-by: Milly <milly.ca@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/option.c b/src/option.c
index cdd457b..a108c52 100644
--- a/src/option.c
+++ b/src/option.c
@@ -2956,7 +2956,7 @@
(void)spell_check_msm();
(void)spell_check_sps();
(void)compile_cap_prog(curwin->w_s);
- (void)did_set_spell_option(TRUE);
+ (void)did_set_spell_option();
#endif
// set cedit_key
(void)did_set_cedit(NULL);
diff --git a/src/optionstr.c b/src/optionstr.c
index bf7135a..b1bb39a 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -3584,7 +3584,7 @@
// If there is a window for this buffer in which 'spell' is set load the
// wordlists.
- return did_set_spell_option(TRUE);
+ return did_set_spell_option();
}
/*
@@ -3600,7 +3600,7 @@
// If there is a window for this buffer in which 'spell' is set load the
// wordlists.
- return did_set_spell_option(FALSE);
+ return did_set_spell_option();
}
/*
diff --git a/src/proto/spell.pro b/src/proto/spell.pro
index 680bf34..a68de8f 100644
--- a/src/proto/spell.pro
+++ b/src/proto/spell.pro
@@ -45,6 +45,6 @@
int expand_spelling(linenr_T lnum, char_u *pat, char_u ***matchp);
int valid_spelllang(char_u *val);
int valid_spellfile(char_u *val);
-char *did_set_spell_option(int is_spellfile);
+char *did_set_spell_option(void);
char *compile_cap_prog(synblock_T *synblock);
/* vim: set ft=c : */
diff --git a/src/spell.c b/src/spell.c
index 909d426..5a7720f 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -2250,7 +2250,7 @@
else
{
// One entry in 'spellfile'.
- copy_option_part(&spf, spf_name, MAXPATHL - 5, ",");
+ copy_option_part(&spf, spf_name, MAXPATHL - 4, ",");
STRCAT(spf_name, ".spl");
// If it was already found above then skip it.
@@ -4441,11 +4441,22 @@
int
valid_spellfile(char_u *val)
{
- char_u *s;
+ char_u spf_name[MAXPATHL];
+ char_u *spf;
+ char_u *s;
+ int l;
- for (s = val; *s != NUL; ++s)
- if (!vim_is_fname_char(*s))
+ spf = val;
+ while (*spf != NUL)
+ {
+ l = copy_option_part(&spf, spf_name, MAXPATHL, ",");
+ if (l >= MAXPATHL - 4 || l < 4
+ || STRCMP(spf_name + l - 4, ".add") != 0)
return FALSE;
+ for (s = spf_name; *s != NUL; ++s)
+ if (!vim_is_fname_char(*s))
+ return FALSE;
+ }
return TRUE;
}
@@ -4454,22 +4465,10 @@
* Return an error message or NULL for success.
*/
char *
-did_set_spell_option(int is_spellfile)
+did_set_spell_option(void)
{
char *errmsg = NULL;
win_T *wp;
- int l;
-
- if (is_spellfile)
- {
- l = (int)STRLEN(curwin->w_s->b_p_spf);
- if (l > 0 && (l < 4
- || STRCMP(curwin->w_s->b_p_spf + l - 4, ".add") != 0))
- errmsg = e_invalid_argument;
- }
-
- if (errmsg != NULL)
- return errmsg;
FOR_ALL_WINDOWS(wp)
if (wp->w_buffer == curbuf && wp->w_p_spell)
diff --git a/src/testdir/gen_opt_test.vim b/src/testdir/gen_opt_test.vim
index 0d27760..4ca3c09 100644
--- a/src/testdir/gen_opt_test.vim
+++ b/src/testdir/gen_opt_test.vim
@@ -146,7 +146,11 @@
\ 'sessionoptions': [['', 'blank', 'help,options,slash'], ['xxx']],
\ 'showcmdloc': [['last', 'statusline', 'tabline'], ['xxx']],
\ 'signcolumn': [['', 'auto', 'no'], ['xxx', 'no,yes']],
- \ 'spellfile': [['', 'file.en.add', '/tmp/dir\ with\ space/en.utf-8.add'], ['xxx', '/tmp/file']],
+ \ 'spellfile': [['', 'file.en.add', 'xxx.en.add,yyy.gb.add,zzz.ja.add',
+ \ '/tmp/dir\ with\ space/en.utf-8.add',
+ \ '/tmp/dir\\,with\\,comma/en.utf-8.add'],
+ \ ['xxx', '/tmp/file', ',file.en.add', 'xxx,yyy.en.add',
+ \ 'xxx.en.add,yyy,zzz.ja.add']],
\ 'spelllang': [['', 'xxx', 'sr@latin'], ['not&lang', "that\\\rthere"]],
\ 'spelloptions': [['', 'camel'], ['xxx']],
\ 'spellsuggest': [['', 'best', 'double,33'], ['xxx']],
diff --git a/src/testdir/test_spellfile.vim b/src/testdir/test_spellfile.vim
index 8abb680..dd12698 100644
--- a/src/testdir/test_spellfile.vim
+++ b/src/testdir/test_spellfile.vim
@@ -1154,7 +1154,7 @@
" 'spellfile' accepts '@' on top of 'isfname'.
def Test_spellfile_allow_at_character()
mkdir('Xtest/the foo@bar,dir', 'p')
- &spellfile = './Xtest/the foo@bar,dir/Xspellfile.add'
+ &spellfile = './Xtest/the foo@bar\,dir/Xspellfile.add'
&spellfile = ''
delete('Xtest', 'rf')
enddef
diff --git a/src/version.c b/src/version.c
index c636211..2043563 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 783,
+/**/
782,
/**/
781,