mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
vim-patch:9.1.0783: 'spell' option setting has problems (#30818)
Problem: 'spell' option setting has problems
Solution: correctly check for comma for 'spellfile' option,
remove unnecessary checks, refactor slightly (Milly)
closes: vim/vim#15873
322ad0c953
Co-authored-by: Milly <milly.ca@gmail.com>
This commit is contained in:
@@ -1705,7 +1705,7 @@ static void didset_options(void)
|
|||||||
spell_check_msm();
|
spell_check_msm();
|
||||||
spell_check_sps();
|
spell_check_sps();
|
||||||
compile_cap_prog(curwin->w_s);
|
compile_cap_prog(curwin->w_s);
|
||||||
did_set_spell_option(true);
|
did_set_spell_option();
|
||||||
// set cedit_key
|
// set cedit_key
|
||||||
did_set_cedit(NULL);
|
did_set_cedit(NULL);
|
||||||
// initialize the table for 'breakat'.
|
// initialize the table for 'breakat'.
|
||||||
|
@@ -2118,7 +2118,7 @@ const char *did_set_spellfile(optset_T *args)
|
|||||||
if ((!valid_spellfile(*varp))) {
|
if ((!valid_spellfile(*varp))) {
|
||||||
return e_invarg;
|
return e_invarg;
|
||||||
}
|
}
|
||||||
return did_set_spell_option(true);
|
return did_set_spell_option();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The 'spelllang' option is changed.
|
/// The 'spelllang' option is changed.
|
||||||
@@ -2131,7 +2131,7 @@ const char *did_set_spelllang(optset_T *args)
|
|||||||
if (!valid_spelllang(*varp)) {
|
if (!valid_spelllang(*varp)) {
|
||||||
return e_invarg;
|
return e_invarg;
|
||||||
}
|
}
|
||||||
return did_set_spell_option(false);
|
return did_set_spell_option();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The 'spelloptions' option is changed.
|
/// The 'spelloptions' option is changed.
|
||||||
|
@@ -2091,7 +2091,7 @@ char *parse_spelllang(win_T *wp)
|
|||||||
int_wordlist_spl(spf_name);
|
int_wordlist_spl(spf_name);
|
||||||
} 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");
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
@@ -3664,30 +3664,26 @@ bool valid_spelllang(const char *val)
|
|||||||
bool valid_spellfile(const char *val)
|
bool valid_spellfile(const char *val)
|
||||||
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
|
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
|
||||||
{
|
{
|
||||||
for (const char *s = val; *s != NUL; s++) {
|
char spf_name[MAXPATHL];
|
||||||
if (!vim_is_fname_char((uint8_t)(*s))) {
|
char *spf = (char *)val;
|
||||||
|
while (*spf != NUL) {
|
||||||
|
size_t l = copy_option_part(&spf, spf_name, MAXPATHL, ",");
|
||||||
|
if (l >= MAXPATHL - 4 || l < 4 || strcmp(spf_name + l - 4, ".add") != 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
for (char *s = spf_name; *s != NUL; s++) {
|
||||||
|
if (!vim_is_fname_char((uint8_t)(*s))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *did_set_spell_option(bool is_spellfile)
|
const char *did_set_spell_option(void)
|
||||||
{
|
{
|
||||||
const char *errmsg = NULL;
|
const char *errmsg = NULL;
|
||||||
|
|
||||||
if (is_spellfile) {
|
|
||||||
int 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_invarg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errmsg != NULL) {
|
|
||||||
return errmsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
|
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
|
||||||
if (wp->w_buffer == curbuf && wp->w_p_spell) {
|
if (wp->w_buffer == curbuf && wp->w_p_spell) {
|
||||||
errmsg = parse_spelllang(wp);
|
errmsg = parse_spelllang(wp);
|
||||||
|
@@ -1155,7 +1155,7 @@ endfunc
|
|||||||
" 'spellfile' accepts '@' on top of 'isfname'.
|
" 'spellfile' accepts '@' on top of 'isfname'.
|
||||||
func Test_spellfile_allow_at_character()
|
func Test_spellfile_allow_at_character()
|
||||||
call mkdir('Xtest/the foo@bar,dir', 'p')
|
call mkdir('Xtest/the foo@bar,dir', 'p')
|
||||||
let &spellfile = './Xtest/the foo@bar,dir/Xspellfile.add'
|
let &spellfile = './Xtest/the foo@bar\,dir/Xspellfile.add'
|
||||||
let &spellfile = ''
|
let &spellfile = ''
|
||||||
call delete('Xtest', 'rf')
|
call delete('Xtest', 'rf')
|
||||||
endfunc
|
endfunc
|
||||||
|
Reference in New Issue
Block a user