aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-05-04 14:44:13 +0800
committerGitHub <noreply@github.com>2023-05-04 14:44:13 +0800
commit24d4a825693db5f8454a389259a76f71f8697832 (patch)
treeef2a8f106faec12f3ba4d9e67a6be4db04fa3e43
parenta1bd31e6010c803fd842db6bdb0d531a71e67837 (diff)
parent7ddf235d7e71ee8373b11baa6a49381311f5d61d (diff)
downloadrneovim-24d4a825693db5f8454a389259a76f71f8697832.tar.gz
rneovim-24d4a825693db5f8454a389259a76f71f8697832.tar.bz2
rneovim-24d4a825693db5f8454a389259a76f71f8697832.zip
Merge pull request #23466 from zeertzjq/vim-9.0.0138
vim-patch:9.0.{0138,0240}: two spell fixes
-rw-r--r--runtime/doc/options.txt1
-rw-r--r--src/nvim/charset.c12
-rw-r--r--src/nvim/spell.c2
-rw-r--r--src/nvim/spellfile.c5
-rw-r--r--test/old/testdir/test_spellfile.vim20
5 files changed, 37 insertions, 3 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index ab86e56a62..324151ee58 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -5706,6 +5706,7 @@ A jump table for the options with a short description can be found at |Q_op|.
Name of the word list file where words are added for the |zg| and |zw|
commands. It must end in ".{encoding}.add". You need to include the
path, otherwise the file is placed in the current directory.
+ The path may include characters from 'isfname', space, comma and '@'.
*E765*
It may also be a comma-separated list of names. A count before the
|zg| and |zw| commands can be used to access each. This allows using
diff --git a/src/nvim/charset.c b/src/nvim/charset.c
index 3d4e0abda9..8cae831881 100644
--- a/src/nvim/charset.c
+++ b/src/nvim/charset.c
@@ -858,8 +858,10 @@ bool vim_iswordp_buf(const char *const p, buf_T *const buf)
return vim_iswordc_buf(c, buf);
}
-/// Check that "c" is a valid file-name character.
+/// Check that "c" is a valid file-name character as specified with the
+/// 'isfname' option.
/// Assume characters above 0x100 are valid (multi-byte).
+/// To be used for commands like "gf".
///
/// @param c character to check
bool vim_isfilec(int c)
@@ -868,6 +870,14 @@ bool vim_isfilec(int c)
return c >= 0x100 || (c > 0 && (g_chartab[c] & CT_FNAME_CHAR));
}
+/// Check if "c" is a valid file-name character, including characters left
+/// out of 'isfname' to make "gf" work, such as comma, space, '@', etc.
+bool vim_is_fname_char(int c)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return vim_isfilec(c) || c == ',' || c == ' ' || c == '@';
+}
+
/// Check that "c" is a valid file-name character or a wildcard character
/// Assume characters above 0x100 are valid (multi-byte).
/// Explicitly interpret ']' as a wildcard character as path_has_wildcard("]")
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index d1d1b9180f..84875261f1 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -3621,7 +3621,7 @@ bool valid_spellfile(const char *val)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
for (const char *s = val; *s != NUL; s++) {
- if (!vim_isfilec((uint8_t)(*s)) && *s != ',' && *s != ' ') {
+ if (!vim_is_fname_char((uint8_t)(*s))) {
return false;
}
}
diff --git a/src/nvim/spellfile.c b/src/nvim/spellfile.c
index b93dd55042..dae9edcf4f 100644
--- a/src/nvim/spellfile.c
+++ b/src/nvim/spellfile.c
@@ -4971,9 +4971,12 @@ static int sug_filltree(spellinfo_T *spin, slang_T *slang)
spin->si_sugtree = true;
// Go through the whole case-folded tree, soundfold each word and put it
- // in the trie.
+ // in the trie. Bail out if the tree is empty.
byts = slang->sl_fbyts;
idxs = slang->sl_fidxs;
+ if (byts == NULL || idxs == NULL) {
+ return FAIL;
+ }
arridx[0] = 0;
curi[0] = 1;
diff --git a/test/old/testdir/test_spellfile.vim b/test/old/testdir/test_spellfile.vim
index dbffbafed9..4d2a6cf35f 100644
--- a/test/old/testdir/test_spellfile.vim
+++ b/test/old/testdir/test_spellfile.vim
@@ -1063,4 +1063,24 @@ func Test_mkspellmem_opt()
call assert_fails('set mkspellmem=1000,50,0', 'E474:')
endfunc
+" 'spellfile' accepts '@' on top of 'isfname'.
+func Test_spellfile_allow_at_character()
+ call mkdir('Xtest/the foo@bar,dir', 'p')
+ let &spellfile = './Xtest/the foo@bar,dir/Xspellfile.add'
+ let &spellfile = ''
+ call delete('Xtest', 'rf')
+endfunc
+
+" this was using a NULL pointer
+func Test_mkspell_empty_dic()
+ call writefile(['1'], 'XtestEmpty.dic')
+ call writefile(['SOFOFROM abcd', 'SOFOTO ABCD', 'SAL CIA X'], 'XtestEmpty.aff')
+ mkspell! XtestEmpty.spl XtestEmpty
+
+ call delete('XtestEmpty.dic')
+ call delete('XtestEmpty.aff')
+ call delete('XtestEmpty.spl')
+endfunc
+
+
" vim: shiftwidth=2 sts=2 expandtab