0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

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>
This commit is contained in:
Milly
2024-10-14 20:21:48 +02:00
committed by Christian Brabandt
parent 0c59c30271
commit 322ad0c953
7 changed files with 28 additions and 23 deletions

View File

@@ -2956,7 +2956,7 @@ didset_options(void)
(void)spell_check_msm(); (void)spell_check_msm();
(void)spell_check_sps(); (void)spell_check_sps();
(void)compile_cap_prog(curwin->w_s); (void)compile_cap_prog(curwin->w_s);
(void)did_set_spell_option(TRUE); (void)did_set_spell_option();
#endif #endif
// set cedit_key // set cedit_key
(void)did_set_cedit(NULL); (void)did_set_cedit(NULL);

View File

@@ -3584,7 +3584,7 @@ did_set_spellfile(optset_T *args)
// If there is a window for this buffer in which 'spell' is set load the // If there is a window for this buffer in which 'spell' is set load the
// wordlists. // wordlists.
return did_set_spell_option(TRUE); return did_set_spell_option();
} }
/* /*
@@ -3600,7 +3600,7 @@ did_set_spelllang(optset_T *args)
// If there is a window for this buffer in which 'spell' is set load the // If there is a window for this buffer in which 'spell' is set load the
// wordlists. // wordlists.
return did_set_spell_option(FALSE); return did_set_spell_option();
} }
/* /*

View File

@@ -45,6 +45,6 @@ void spell_expand_check_cap(colnr_T col);
int expand_spelling(linenr_T lnum, char_u *pat, char_u ***matchp); int expand_spelling(linenr_T lnum, char_u *pat, char_u ***matchp);
int valid_spelllang(char_u *val); int valid_spelllang(char_u *val);
int valid_spellfile(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); char *compile_cap_prog(synblock_T *synblock);
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@@ -2250,7 +2250,7 @@ parse_spelllang(win_T *wp)
else else
{ {
// One entry in 'spellfile'. // One entry in 'spellfile'.
copy_option_part(&spf, spf_name, MAXPATHL - 5, ","); copy_option_part(&spf, spf_name, MAXPATHL - 4, ",");
STRCAT(spf_name, ".spl"); STRCAT(spf_name, ".spl");
// If it was already found above then skip it. // If it was already found above then skip it.
@@ -4441,11 +4441,22 @@ valid_spelllang(char_u *val)
int int
valid_spellfile(char_u *val) valid_spellfile(char_u *val)
{ {
char_u spf_name[MAXPATHL];
char_u *spf;
char_u *s; char_u *s;
int l;
for (s = val; *s != NUL; ++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)) if (!vim_is_fname_char(*s))
return FALSE; return FALSE;
}
return TRUE; return TRUE;
} }
@@ -4454,22 +4465,10 @@ valid_spellfile(char_u *val)
* Return an error message or NULL for success. * Return an error message or NULL for success.
*/ */
char * char *
did_set_spell_option(int is_spellfile) did_set_spell_option(void)
{ {
char *errmsg = NULL; char *errmsg = NULL;
win_T *wp; 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) FOR_ALL_WINDOWS(wp)
if (wp->w_buffer == curbuf && wp->w_p_spell) if (wp->w_buffer == curbuf && wp->w_p_spell)

View File

@@ -146,7 +146,11 @@ let test_values = {
\ 'sessionoptions': [['', 'blank', 'help,options,slash'], ['xxx']], \ 'sessionoptions': [['', 'blank', 'help,options,slash'], ['xxx']],
\ 'showcmdloc': [['last', 'statusline', 'tabline'], ['xxx']], \ 'showcmdloc': [['last', 'statusline', 'tabline'], ['xxx']],
\ 'signcolumn': [['', 'auto', 'no'], ['xxx', 'no,yes']], \ '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"]], \ 'spelllang': [['', 'xxx', 'sr@latin'], ['not&lang', "that\\\rthere"]],
\ 'spelloptions': [['', 'camel'], ['xxx']], \ 'spelloptions': [['', 'camel'], ['xxx']],
\ 'spellsuggest': [['', 'best', 'double,33'], ['xxx']], \ 'spellsuggest': [['', 'best', 'double,33'], ['xxx']],

View File

@@ -1154,7 +1154,7 @@ endfunc
" 'spellfile' accepts '@' on top of 'isfname'. " 'spellfile' accepts '@' on top of 'isfname'.
def Test_spellfile_allow_at_character() def Test_spellfile_allow_at_character()
mkdir('Xtest/the foo@bar,dir', 'p') mkdir('Xtest/the foo@bar,dir', 'p')
&spellfile = './Xtest/the foo@bar,dir/Xspellfile.add' &spellfile = './Xtest/the foo@bar\,dir/Xspellfile.add'
&spellfile = '' &spellfile = ''
delete('Xtest', 'rf') delete('Xtest', 'rf')
enddef enddef

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
783,
/**/ /**/
782, 782,
/**/ /**/