拼写
Nvim :help
页面,生成 于 源代码 使用 tree-sitter-vimdoc 解析器。
拼写检查
此命令开启拼写检查
:setlocal spell spelllang=en_us
这将开启
'spell' 选项并指定检查美式英语。
Vim 仅检查单词拼写,不进行语法检查。
如果
'mousemodel' 选项设置为 "popup" 且光标位于拼写错误的单词上,或者它设置为 "popup_setpos" 且鼠标指针位于拼写错误的单词上,那么弹出菜单将包含一个子菜单以替换错误的单词。
注意: 这会减慢弹出菜单的出现速度。
搜索下一个拼写错误的单词
[s [s 像 "]s" 一样,但向后搜索,查找光标前的拼写错误的单词。无法识别跨越两行的单词,因此可能会停在未被突出显示为错误的单词处。不会停在开头缺少大写的单词处。
]S ]S 像 "]s" 一样,但只停在错误的单词上,而不是罕见的词或其他区域的单词。
[r [r 像 "]r" 一样,但向后搜索,查找光标前的“罕见”词。无法识别跨越两行的单词,因此可能会停在未被突出显示为罕见的词处。
将单词添加到自己的单词列表中
在可视模式下,选定的字符将被添加为单词(包括空格!)。当光标位于标记为拼写错误的文本上时,将使用标记的文本。否则,将使用光标下的单词,并以非单词字符分隔。
如果该单词在另一个拼写文件中被明确标记为错误单词,则结果不可预测。
:spe[llgood]!
{word}
将
{word}
添加为好词到内部单词列表中,类似于
zG。
:spellw[rong]!
{word}
将
{word}
添加为错误(坏)词到内部单词列表中,类似于
zW。
没有普通模式命令可以将单词标记为罕见词,因为这是一个相当不常见的命令,所有直观的命令都被占用。如果你愿意,你可以使用例如添加映射
nnoremap z? :exe ':spellrare ' .. expand('<cWORD>')<CR>
nnoremap z/ :exe ':spellrare! ' .. expand('<cWORD>')<CR>
:spellra[re]!
{word}
将
{word}
添加为罕见词到内部单词列表中,类似于
zW。
查找错误单词的建议:
z=z= 为光标下/后的单词建议拼写正确的单词。这也适用于查找未被突出显示为错误单词的单词的替代词,例如,当后面的单词是错误的时。在可视模式下,突出显示的文本将被视为要替换的单词。结果按与要替换的单词的相似度排序。这可能需要很长时间。当你厌倦了的时候,按下
CTRL-C
。
如果命令不带计数使用,则将列出替代词,你可以输入你的选择的数字,或者如果不想替换,则按 <Enter>
。你也可以使用鼠标点击你的选择(仅在普通模式下可以使用鼠标并且没有换行时有效)。点击第一行(标题)取消。
列出的建议通常会替换突出显示的错误单词。有时它们会包含其他文本,在这种情况下,替换的文本也会在“<”之后列出。
如果使用了计数,则将使用该建议,不会提示。例如,“1z=” 总是选择第一个建议。
如果
'verbose' 非零,则将显示一个分数,该分数与建议一起显示,以指示与拼写错误单词的可能性(分数越高,差异越大)。当一个单词被替换时,重做命令“.”将重复单词替换。它像 "ciw" 一样工作,包含好词和
<Esc>
。这对于泰国语和其他单词之间没有空格的语言无效。
在插入模式下,当光标位于拼写错误的单词之后时,可以使用 CTRL-X s 查找建议。这类似于插入模式的补全。使用 CTRL-N 使用下一个建议,
CTRL-P
返回上一个。
i_CTRL-X_s
'spelloptions' 选项有几个额外的标志,这些标志会影响拼写检查的工作方式。例如,“camel” 将 CamelCased 单词拆分,以便分别检查每个部分的拼写。
Vim 统计好词出现的次数。这用于对建议进行排序:之前见过的单词会获得一个小奖励,经常见过的单词会获得更大的奖励。AFFIX 文件中的 COMMON 项目可用于定义常见词,因此这种机制在新文件或短文件中也能正常工作
spell-COMMON。
区域
一个单词在不同的区域可能拼写不同。例如,英语有以下(至少)变体
en 所有区域 en_au 澳大利亚 en_ca 加拿大 en_gb 大不列颠 en_nz 新西兰 en_us 美国
始终使用小写字母表示语言和区域名称。
spell-german 特殊例外:对于德语,将使用以下特殊区域:de 所有接受的德语单词 de_de 旧拼写和新拼写 de_19 旧拼写 de_20 新拼写 de_at 奥地利 de_ch 瑞士
spell-russian 特殊例外:对于俄语,将使用以下特殊区域:ru 所有接受的俄语单词 ru_ru "IE" 字母拼写 ru_yo "YO" 字母拼写
spell-yiddish 由于使用了特殊字符,意第绪语需要使用 "utf-8" 编码。如果您使用的是 latin1,Vim 将使用音译(罗马化)的意第绪语。如果您想使用 utf-8 的音译意第绪语,请使用 "yi-tr"。在一个表格中:
'encoding' 'spelllang' utf-8 yi 意第绪语 latin1 yi 音译的意第绪语 utf-8 yi-tr 音译的意第绪语
spell-cjk 中文、日文和其他东亚字符通常被标记为错误,因为不支持对这些字符进行拼写检查。如果
'spelllang' 包含 "cjk",则这些字符不会被标记为错误。这在编辑包含一些亚洲单词的文本时进行拼写检查时很有用。
"LL" 的值来自
'spelllang',但不包括区域名称。示例
en_us en en-rare en-rare medical_ca medical
仅加载第一个文件,即
'runtimepath' 中第一个的文件。如果成功,则另外加载名为 LL.EEE.add.spl 的文件。找到的所有文件都会被使用。
例外情况
当
'encoding' 为 "iso-8859-15" 时,Vim 使用 "latin1"。欧元符号对拼写没有影响。
当找不到
'encoding' 的拼写文件时,会尝试 "ascii"。这仅适用于几乎所有单词都是 ASCII 的语言,例如英语。当
'encoding' 不是 "latin1"(例如 iso-8859-2)并且正在编辑英文文本时,这很有用。对于 ".add" 文件,使用与找到的主拼写文件相同的名称。
Vim 将查找:1. ~/.config/nvim/spell/pl.iso-8859-2.spl 2. /usr/share/nvim/runtime/spell/pl.iso-8859-2.spl 3. ~/.config/nvim/spell/pl.iso-8859-2.add.spl 4. /usr/share/nvim/runtime/spell/pl.iso-8859-2.add.spl 5. ~/.config/nvim/after/spell/pl.iso-8859-2.add.spl
假设 1. 未找到,而 2. 已找到。
如果
'encoding' 为 "latin1",Vim 将查找:1. ~/.config/nvim/spell/pl.latin1.spl 2. /usr/share/nvim/runtime/spell/pl.latin1.spl 3. ~/.config/nvim/after/spell/pl.latin1.spl 4. ~/.config/nvim/spell/pl.ascii.spl 5. /usr/share/nvim/runtime/spell/pl.ascii.spl 6. ~/.config/nvim/after/spell/pl.ascii.spl
假设它们都没有找到(波兰语在省略非 ASCII 字符时没有意义)。
spell-sug-file E781 如果存在与 ".spl" 文件完全相同的名称但以 ".sug" 结尾的文件,则该文件将用于提供更好的建议。它不会在提出建议之前加载,以减少内存使用。
zw 命令将
'spellfile' 中的现有条目转换为注释行。这样可以避免每次都必须编写一个新文件,但会导致文件只会变长,而不会变短。要清理所有 ".add" 拼写文件中的注释行,请执行以下操作
:runtime spell/cleanadd.vim
这会删除所有注释行,除了以 "##" 开头的注释行。使用 "##" 行添加要保留的注释。
您可以根据需要随意调用此脚本。提供了一个变量,用于跳过更新最近更改过的文件。将其设置为文件更改后经过的秒数,在经过该秒数之前不会进行清理。例如,要仅清理在过去一小时内未更改的文件
let g:spell_clean_limit = 60 * 60
默认值为一秒。
单词
包含单词字符的表格存储在主 .spl 文件中。因此,生成它时当前的区域设置很重要!但是,.add.spl 文件不包含单词表格。
对于以数字开头的单词,将忽略该数字,除非整个单词都被识别。因此,如果 "3D" 是一个单词,而 "D" 不是,则 "3D" 被识别为一个单词,但如果 "3D" 不是一个单词,则仅 "D" 被标记为错误。识别形式为 0x12ab 和 0X12AB 的十六进制数。
单词组合
可以对包含空格的单词进行拼写检查。这用于识别在单独使用时无效的单词,例如 "et al."。它也可以用于识别 "the the" 并突出显示它。
空格的数量无关紧要。在大多数情况下,还可以出现换行符。但是,这使得很难确定从哪里开始检查拼写错误。当您对一行进行更改,并且仅重新绘制该行时,Vim 不会查看上一行,因此,当 "et" 位于上一行的末尾时,"al." 将被标记为错误。当您键入 "the<CR>the" 时,突出显示不会在第一行重新绘制之前出现。使用
CTRL-L 立即重新绘制。"[s" 也会在包含换行符的单词组合处停止。
遇到换行符时,Vim 会跳过 "*"、">" 和 '"' 等字符,以便可以对 C、shell 和 Vim 代码中的注释进行拼写检查。
使用语法高亮显示的文件可以指定应该在哪里进行拼写检查
1. 任何地方 默认 2. 在特定项中 使用 "contains=@Spell" 3. 任何地方,但特定项除外 使用 "contains=@NoSpell"
对于第二种方法,添加 @NoSpell 聚类将再次禁用拼写检查。例如,这可用于将 @Spell 添加到程序的注释中,并将 @NoSpell 添加到不应检查的项中。另请参见
:syn-spell,了解不在语法项中的文本。
Vim 脚本
如果您想编写一个 Vim 脚本,使用拼写执行某些操作,您可能会发现这些函数很有用
spellbadword() 查找光标处的拼写错误的单词 spellsuggest() 获取拼写建议列表 soundfold() 获取单词的近音词版本
发行版包含其中一些文件。使用此命令查看它们的作用
:next $VIMRUNTIME/spell/*.vim
请注意,默认脚本不会在从默认值更改时设置
'spellcapcheck'。假设用户更喜欢另一个值。
1. 您知道如何拼写该单词,但输入错误。这会导致编辑距离很小(字符交换/省略/插入),并且可能导致单词听起来完全不同。
2. 您不知道如何拼写该单词,并输入听起来正确的单词。编辑距离可能很大,但单词在音调折叠后很相似。
由于这两种错误的分数差异很大,因此我们对每种错误使用一个列表,并将它们混合在一起。
如果您安装了 Aap(来自 www.a-a-p.org),则可以使用 runtime/spell/??/ 目录中的配方。Aap 将负责下载文件、应用 Vim 需要的补丁并构建 .spl 文件。
确保您的当前区域设置正确,否则 Vim 无法识别哪些字符是大写/小写字母。如果该区域设置不可用(例如,在 Unix 上使用 MS-Windows 代码页时),请在 .aff 文件中添加表格
spell-affix-chars。如果 .aff 文件没有定义表格,则使用当前活动拼写中的单词表格。如果拼写未处于活动状态,则 Vim 会尝试猜测。
:mksp :mkspell :mksp[ell][!] [-ascii]
{outname}
{inname}
... 从单词列表生成 Vim 拼写文件。示例
:mkspell /tmp/nl nl_NL.words
E751 当
{outname}
以 ".spl" 结尾时,它将用作输出文件名。否则,它应该是一个语言名称,例如 "en",不含区域名称。写入的文件将是 "{outname}.{encoding}.spl",其中
{encoding}
是
'encoding' 选项的值。
如果输出文件已存在,则必须使用 [!] 覆盖它。
当存在 [-ascii] 参数时,将跳过包含非 ASCII 字符的单词。生成的最终文件将以 "ascii.spl" 结尾。
输入可以是 Myspell 格式文件 {inname}
.aff 和 {inname}
.dic。如果 {inname}
.aff 不存在,则 {inname}
将用作普通单词列表的文件名。
可以给出多个
{inname}
参数,将多个区域合并到一个 Vim 拼写文件中。示例
:mkspell ~/.config/nvim/spell/en /tmp/en_US /tmp/en_CA /tmp/en_AU
这将把美国、加拿大和澳大利亚的英语单词列表合并到一个 en.spl 文件中。最多可以合并八个区域。
E754 E755 将使用第一个 .aff 文件中出现的 REP 和 SAL 项目。
spell-REP spell-SAL E845此命令将使用大量的内存,用于查找最佳单词树(波兰语、意大利语和匈牙利语需要数百兆字节)。最终结果将更小,因为使用了压缩。为了避免内存不足,压缩将在一段时间后执行。这可以通过
'mkspellmem' 选项进行调整。
在拼写文件写入并开始在缓冲区中使用后,它将自动重新加载。
:mksp[ell] [-ascii] {name}
.{enc}.add 与上面的 ":mkspell" 相似,使用 {name}
.{enc}.add 作为输入文件,并在同一目录中生成一个追加 ".spl" 的输出文件。
:mksp[ell] [-ascii] {name}
与上面的 ":mkspell" 相似,使用 {name}
作为输入文件,并在同一目录中生成一个追加 ".{enc}.spl" 的输出文件。
Vim 将报告重复单词的数量。这可能是单词列表中的错误。但有时,它用于为同一个基本单词提供不同的前缀和后缀,以避免它们合并(例如,捷克语使用这种方法)。如果您希望 Vim 报告所有重复单词,请设置
'verbose' 选项。
由于您可能希望更改 Myspell 单词列表以供 Vim 使用,因此建议执行以下步骤
1. 从 Myspell 获取 xx_YY.aff 和 xx_YY.dic 文件。2. 将这些文件复制到 xx_YY.orig.aff 和 xx_YY.orig.dic。3. 更改 xx_YY.aff 和 xx_YY.dic 文件以删除错误的单词,添加缺少的单词,使用 FOL/LOW/UPP 定义单词字符等。可以使用分发的 "*.diff" 文件。4. 使用正确的区域设置启动 Vim,并使用
:mkspell 生成 Vim 拼写文件。5. 使用 ":set spell spelllang=xx" 测试拼写文件(如果您在
'runtimepath' 中的拼写目录中编写了它),或者使用 ":set spelllang=xx.enc.spl"(如果您在其他地方编写了它)。
当 Myspell 文件更新时,您可以合并差异:1. 获取新的 Myspell 文件作为 xx_YY.new.aff 和 xx_UU.new.dic。2. 使用
diff-mode 查看发生了哪些变化
nvim -d xx_YY.orig.dic xx_YY.new.dic
3. 将您喜欢的更改应用到 xx_YY.dic。您可能还需要更改 xx_YY.aff。4. 将 xx_YY.new.dic 重命名为 xx_YY.orig.dic,并将 xx_YY.new.aff 重命名为 xx_YY.orig.aff。
拼写检查是 Vim 中一个相对较新的功能,因此 .spl 文件格式可能会更改以支持更多语言。Vim 将检查拼写文件的有效性,并报告任何错误。
E771:旧的拼写文件,需要更新
此拼写文件比您的 Vim 版本更旧。您需要更新 .spl 文件。
E772:拼写文件适用于更新版本的 Vim
这意味着拼写文件是为更新版本的 Vim 创建的。您需要更新 Vim。
E770:拼写文件中不支持的部分
这意味着拼写文件是为更新版本的 Vim 创建的,并且包含拼写文件正常运行所需的部分。在这种情况下,最好升级您的 Vim。
拼写文件转储
如果出于某种原因,您想检查当前使用的拼写文件支持哪些单词,请使用以下命令
:spelldump :spelld :spelld[ump] 打开一个新窗口,并用所有当前有效的单词填充它。不包括复合词。
注意:对于某些语言,结果可能非常大,导致 Vim 内存不足。
:spelld[ump]! 与 ":spelldump" 相似,并包含单词计数。这是更新屏幕时找到单词的次数。COMMON 项目中的单词将获得 10 的起始计数。
当
'spelllang' 的所有条目使用相同的区域或根本不使用区域时,区域信息将包含在转储的单词中。否则,只包含当前区域的单词,并且不会生成 "/regions" 行。
包含 .spl 文件名称的注释行用作从该 .spl 文件生成的单词上方的标题。
如果您的语言的拼写文件不可用,您将收到一条错误消息。但如果 "spellfile.vim" 插件处于活动状态,它会提示您下载拼写文件。只需按照说明操作,它会询问您将文件写入的位置(为此,
'runtimepath' 中必须有一个可写目录)。
该插件在 Vim ftp 服务器上有一个用于查找拼写文件的默认位置。出于安全考虑,使用的协议是 SSL (
https://)。如果您想使用其他位置或其他协议,请将 g:spellfile_URL 变量设置为包含拼写文件的目录。您可以使用
http:// 或 ftp://,但这样会带来安全风险。
netrw 插件用于获取文件,请查看该插件了解 URL 的具体语法。示例
let g:spellfile_URL = 'https://ftp.nluug.nl/vim/runtime/spell'
您可能需要转义特殊字符。
该插件只会询问您是否要下载一种语言一次。如果您想重新尝试,请重新启动 Vim,或将 g:spellfile_URL 设置为另一个值(例如,在前面加上空格)。
要避免使用 "spellfile.vim" 插件,请在您的 vimrc 文件中执行以下操作
let loaded_spellfile_plugin = 1
您可以定义一个
SpellFileMissing 自动命令来处理缺失的文件,而不是使用插件。您可以像这样使用它
:au SpellFileMissing * call Download_spell_file(expand('<amatch>'))
因此,
<amatch>
项目包含语言的名称。另一个重要的值是
'encoding',因为每个编码都有自己的拼写文件。有两个例外
对于 ISO-8859-15 (latin9),使用名称 "latin1"(这些编码仅在字典单词中未使用的人物字符方面有所不同)。
名称 "ascii" 也可用于某些语言,在这些语言中,大多数单词只使用 ASCII 字母。
默认的 "spellfile.vim" 插件使用此自动命令。如果您之后定义了自己的自动命令,您可能希望使用 ":au! SpellFileMissing" 来覆盖它。如果您在加载插件之前定义了自己的自动命令,它会注意到这一点,并且不会执行任何操作。
E797请注意,SpellFileMissing 自动命令不能更改或破坏用户正在编辑的缓冲区。
这是创建和维护单词列表的人使用的文件的格式。
请注意,我们在这里避免使用 "字典" 这个词。这是因为拼写检查的目标不同于编写字典(如书籍中那样)。对于拼写,我们需要一个允许的单词列表,因此不应该突出显示这些单词。人物和公司名称不会出现在字典中,但会出现在单词列表中。而一些旧词很少使用,而它们却是常见的拼写错误。这些词会出现在字典中,但不会出现在单词列表中。
有两种格式:一个简单的单词列表和一个使用词缀压缩的列表。使用词缀压缩的文件由 Myspell(Mozilla 和 OpenOffice.org)使用。这需要两个文件,一个扩展名为 .aff,另一个扩展名为 .dic。
单词必须一行一个出现。这是唯一的要求。
此外,还识别以下项目
/encoding=utf-8
以 "/encoding=" 开头的行(在任何单词之前)指定文件的编码。第二个 "=" 之后是一个编码名称。这告诉 Vim 从指定的编码转换为
'encoding'。因此,您可以为多个目标编码使用一个单词列表。
/regions=usca
以 "/regions=" 开头的行指定支持的区域名称。每个区域名称必须是两个 ASCII 字母。第一个是区域 1。因此,"/regions=usca" 有区域 1 "us" 和区域 2 "ca"。在附加单词列表中,区域名称应与主单词列表相同!
其他以 "/" 开头的行保留供将来使用。无法识别的行将被忽略。您会收到一条警告消息,以便您知道某些内容无法正常工作。
单词后面可以跟一个 "/",然后是以下项目:= 必须完全匹配大小写。? 罕见词。! 错误(错误)的词。1 到 9 该词有效的区域。如果未指定区域,则该词在所有区域中有效。
示例
# 这是一个示例单词列表注释 /encoding=latin1 文件的编码 /regions=uscagb 区域 "us"、"ca" 和 "gb" 适用于所有区域的示例词 blah/12 适用于区域 "us" 和 "ca" 的词 vim/! 错误的词 Campbell/?3 区域 3 "gb" 中的罕见词 's mornings/= 保留大小写的词
请注意,当使用 "/=" 时,所有字母都大写的同一个单词将不被接受。这与大小写混合的单词不同,大小写混合的单词会自动标记为保留大小写,这些单词可能会以所有大写字母出现。
有两个文件:基本词典和词缀文件。词缀文件指定语言设置,可以包含词缀。词缀用于修改基本词以获得完整的词典。这大大减少了单词数量,尤其是对于波兰语这样的语言。这被称为词缀压缩。
基本词典和词缀文件与 ":mkspell" 命令结合使用,生成一个二进制拼写文件。所有预处理已完成,因此该文件加载速度快。二进制拼写文件格式在源代码 (src/spell.c) 中描述。但只有开发人员需要了解它。
预处理还允许我们获取 Myspell 语言文件,并在制作 Vim 词典之前修改它们。这些工具可以在 "src/spell" 目录中找到。
一个简短的示例,带有行号
1 1234
2 aan
3 Als
4 Etten-Leur
5 et al.
6 's-Gravenhage
7 's-Gravenhaags
8 # 不同地区的单词
9 kado/1
10 cadeau/2
11 TCP,IP
12 /S 词缀可能会添加一个 's'
13 bedel/S
第一行包含单词数量。Vim 会忽略它,但如果你没有它,你会收到错误消息。
E760
接下来是每行一个单词。行尾的空格会被忽略,其他空格都会被保留。编码在词缀文件中指定
spell-SET。
注释行以 '#' 或 '/' 开头。请参见示例行 8 和 12。请注意,在单词之后添加注释是不允许的
在单词之后,有一个可选的斜杠和标志。大多数这些标志是字母,表示可以与该单词一起使用的词缀。这些在 .aff 文件中的 SFX 和 PFX 行中指定,请参见
spell-SFX 和
spell-PFX。Vim 允许使用词缀文件中的 FLAG 项目与其他标志类型一起使用
spell-FLAG。
当单词只有小写字母时,它也将与以大写字母开头的单词匹配。
当单词包含大写字母时,这意味着在此位置需要大写字母。相同单词在此位置使用小写字母将不匹配。如果其他一些字母是大写字母,它也不会匹配。
所有字母都为大写的单词将始终有效。
词典列表匹配不匹配
als als Als ALS ALs AlS aLs aLS Als Als ALS als ALs AlS aLs aLS ALS ALS als Als ALs AlS aLs aLS AlS AlS ALS als Als ALs aLs aLS
注意:在第 5 到 7 行中使用了非单词字符。你可以在单词中包含任何字符。在检查文本时,单词只有在出现非单词字符之前和之后才会匹配。对于 Myspell,以非单词字符开头的单词可能无法正常工作。
在第 12 行中定义了 "TCP/IP" 单词。由于斜杠具有特殊含义,因此使用逗号代替。这是由词缀文件中的 SLASH 项目定义的,请参见
spell-SLASH。请注意,如果没有此 SLASH 项目,单词将是 "TCP,IP"。
.aff 文件中的注释行以 '#' 开头
具有固定参数数量的项目可以在之后添加注释。但前提是所有参数都不能包含空格。注释必须以 "#" 字符开头。示例
KEEPCASE = # 为具有此标志的单词修正大小写
词缀文件可以使用 "iconv" 支持的任何编码。但是,在某些情况下,当前区域设置也应该在调用
:mkspell 时正确设置。添加 FOL/LOW/UPP 行将消除此要求
spell-FOL。
编码应该在任何编码相关的地方之前指定。编码同时适用于词缀文件和词典文件。它使用 SET 行完成
词缀文件中的这些条目可用于向拼写文件添加信息。对格式没有限制,但它们应该使用正确的编码。
所有三行必须具有完全相同的字符数量。
"FOL" 行指定了大小写折叠字符。这些字符用于比较单词,同时忽略大小写。对于大多数编码,这与小写行相同。
"LOW" 行指定了小写字符。它通常与 "FOL" 行相同。
"UPP" 行指定了大写字符。也就是说,一个字符是大写字母,当它与 "FOL" 中同一位置的字符不同时。
德语的尖锐的 s ß 是一个例外。大写版本是 "SS"。在 FOL/LOW/UPP 行中应该包含它,以便它被识别为单词字符,但在所有三行中使用 ß 字符。
应该省略 ASCII 字符,Vim 始终以相同的方式处理它们。当编码为 UTF-8 时,无需指定任何单词字符。
E763 Vim 允许你对同一个文件中的多种语言使用拼写检查。你可以在
'spelllang' 选项中列出它们。因此,所有具有相同编码的拼写文件必须使用相同的单词字符,否则它们无法在不出现错误的情况下组合使用。
如果你收到 E763 警告,表明单词表不同,你需要更新你的 ".spl" 拼写文件。如果你下载了这些文件,请获取你使用的所有拼写文件的最新版本。如果你只使用一种语言,例如德语,那么也请下载最新的英语拼写文件。否则,使用
:mkspell 重新生成 .spl 文件。如果你仍然遇到错误,请检查使用过的 .aff 文件中的 FOL、LOW 和 UPP 行。
使用 "-ascii" 参数生成的 XX.ascii.spl 拼写文件不会包含字符表,因此它可以与任何编码的拼写文件组合使用。.add.spl 文件也不包含表。
词中字符
spell-midword 某些字符只有在两个普通单词字符之间使用时才被视为单词字符。例如,单引号:它通常用于将文本放在引号中,因此它不能被识别为单词字符,但当它出现在单词字符之间时,它必须是单词的一部分。这需要检测像 they'are 这样的拼写错误。应该是 they're,但由于 "they" 和 "are" 本身是单词,因此不会被注意到。
这些字符在 .aff 文件中使用 MIDWORD 定义。示例
标志用于指定可以与单词一起使用的词缀以及单词的其他属性。通常使用单个字符标志。这限制了可能的标志数量,尤其是对于 8 位编码。如果要使用更多词缀,可以使用 FLAG 项目。可能的值
FLAG long 使用两个字符标志 FLAG num 使用数字,从 1 到 65000 FLAG caplong 使用不包含 A-Z 的一个字符标志,以及以 A-Z 开头的两个字符标志
使用 "FLAG num" 时,词缀列表中的数字需要用逗号分隔:"234,2143,1435"。这种方法效率低下,但如果文件是使用程序生成的,则很有用。
使用 "caplong" 时,所有两个字符标志都以大写字母开头:"Aa","B1","BB",等等。这对于使用一个字符标志表示最常用的项目,以及使用两个字符标志表示不常用的项目很有用。
注意:使用 utf-8 时,只有 65000 之前的字符可用于标志。
注意:即使使用 "num" 或 "long",用于合成和前缀的标志数量也限制在约 250 个。
摘要
SFX L Y 2
SFX L 0 re [^x]
SFX L 0 ro x
第一行是标题,包含四个字段:SFX {flag}
{combine}
{count}
{combine}
可以是 'Y' 或 'N'。当为 'Y' 时,单词加上后缀也可以有前缀。当为 'N' 时,不允许使用前缀。
{count}
以下行的数量。如果这个数字错误,您将收到错误消息。
对于 PFX,字段完全相同。
以下行的基本格式为:SFX {flag}
{strip}
{add}
{condition}
{extra}
{flag}
必须与第一行中使用的 {flag}
相同。
{strip}
从基本单词中删除的字符。不会检查这些字符是否实际存在,只使用长度(以字节为单位)。这最好匹配 {condition}
,否则可能会发生奇怪的事情。如果 {strip}
长度等于或大于基本单词,则不会使用后缀。当 {strip}
为 0(零)时,不删除任何内容。
{add}
添加到基本单词的字符,在删除
{strip}
后。可以选择在后面添加一个 '/',后面跟着标志。这些标志适用于单词加上后缀。参见
spell-affix-flags
{condition}
一个简单的模式。只有当它与基本单词匹配时,后缀才会应用于该单词。这通常用于使用一个后缀字母,并使用不同的
{add}
和
{strip}
字段来表示结尾不同的单词。当
{condition}
为 .(点)时,没有条件。模式可能包含
文字字符。
在 [] 中的一组字符。[abc] 匹配 a、b 和 c。允许使用连字符表示范围 [a-c],但这特定于 Vim。
一组以 ^ 开头的字符,表示指定字符的补集。[^abc] 匹配除 a、b 和 c 之外的任何字符。
{extra}
可选的额外文本:# 注释 注释被忽略 - Hunspell 使用它,忽略
对于 PFX,字段相同,但 {strip}
、{add}
和 {condition}
应用于单词的开头。
注意: Myspell 忽略与相关信息之后的任何额外文本。Vim 要求此文本以 "#" 开头,以便不会忽视错误。示例
SFX F 0 in [^i]n # Spion > Spionin
SFX F 0 nen in # Bauerin > Bauerinnen
但是,为了避免在为 Myspell 编写的后缀文件中出现大量错误,您可以添加 IGNOREEXTRA 标志。
显然,Myspell 允许后缀名称出现多次。由于这也有可能是一个错误,Vim 会检查是否有额外的“S”。使用此功能的 Myspell 后缀文件似乎具有此标志。示例
SFX a Y 2 S
SFX a 0 en .
SFX a 0 on .
这是来自 Hunspell 的一项功能:后缀可以指定标志。这与在基本单词上指定的标志类似。这些标志适用于基本单词加上后缀(但有一些限制)。示例
SFX A Y 1
SFX A 0 able/S .
当词典文件包含 "drink/AS" 时,这些单词是可能的
drink drinks 使用 S 后缀 drinkable 使用 A 后缀 drinkables 使用 A 后缀,然后使用 S 后缀
通常,后缀的标志会添加到基本单词的标志中,两者都用于单词加上后缀。但基本单词的标志只对后缀使用一次,除非同时使用一个前缀和一个后缀,而两者都支持组合。
具体来说,后缀标志可用于
后缀上的后缀,如上面的示例。这只能使用一次,因此您可以在一个单词上使用两个后缀(加上一个前缀)。
NEEDAFFIX:需要另一个后缀才能形成有效的单词。
CIRCUMFIX,如下一段解释。
通常,Vim 会对不以 '#' 开头的额外字段发出错误。这样可以避免错误被忽视。但是,为 Myspell 或 Hunspell 创建的一些文件可能包含许多带有额外字段的条目。使用 IGNOREEXTRA 标志来避免大量错误。
CIRCUMFIX 标志意味着必须同时添加前缀和后缀。如果前缀具有 CIRCUMFIX 标志,则只能添加具有 CIRCUMFIX 标志的后缀,反之亦然。另一种方法是只指定后缀,并为该后缀提供两个标志:所需的前缀和 NEEDAFFIX 标志。
spell-NEEDAFFIX
当后缀文件包含大量适用于许多单词的前缀时,不可能在内存中构建整个单词列表。这适用于希伯来语(包含所有单词的列表超过 1 GB)。在这种情况下,必须推迟应用前缀。这会使拼写检查变慢。它在 .aff 文件中的此关键字中指示
只有没有 chop 字符串和没有标志的前缀可以推迟。具有 chop 字符串或标志的前缀仍将包含在单词列表中。一个例外是,如果 chop 字符串是一个字符,并且等于添加的字符串的最后一个字符,但以小写形式。因此,当 chop 字符串用于允许后面的单词以大写字母开头时。
斜杠用于 .dic 文件中,用于将基本单词与后缀字母和其他标志分开。不幸的是,这意味着您不能在单词中使用斜杠。因此 "TCP/IP" 不是一个单词,而是带有 "IP" 标志的 "TCP"。要在单词中包含斜杠,请在前面加上反斜杠:"TCP\/IP"。在您需要在单词内部使用反斜杠的极少数情况下,您需要使用两个反斜杠。反斜杠的其他任何用法都保留用于将来扩展。
在后缀文件中,可以使用 KEEPCASE 行来定义用于保留大小写单词的后缀名称。示例
Myspell 不支持此标志。它的意思是大小写很重要。如果单词在句首没有首字母大写,则可以使用它。示例
词典列表匹配不匹配
's morgens/= 's morgens 'S morgens 's Morgens 'S MORGENS 's Morgens 's Morgens 'S MORGENS 'S morgens 's morgens
该标志还可以用于避免单词在全部大写时匹配。
在后缀文件中,可以使用 RARE 行来定义用于罕见单词的后缀名称。示例
罕见单词的突出显示方式与错误单词不同。这是用于语言中正确的单词,但很少使用,而且也可能只是打字错误。
此标志也可以用于后缀,这样基本单词不罕见,但基本单词加上后缀很罕见
spell-affix-flags。但是,如果单词以另一种方式(例如,在另一个区域)也作为好词出现,则不会将其标记为罕见。
在后缀文件中,可以使用 BAD 行来定义用于错误单词的后缀名称。示例
这可以用于排除本来是好词的单词。例如,.dic 文件中的 "the the"
一旦某个单词被标记为错误,它就不会通过遇到相同的单词作为好词而被撤销。
该标志也适用于带有后缀的单词,因此这可以用于将一组相关的单词标记为错误。
复合词是由连接 .dic 文件中出现的单词而成的较长单词。要指定哪些单词可以连接,请使用一个字符。该字符放在单词后面的后缀列表中。我们将在本文中将其称为标志。显然,这些标志必须与任何使用的后缀 ID 不同。
spell-COMPOUNDFLAG Myspell 兼容方法使用一个标志,使用 COMPOUNDFLAG 指定。所有具有此标志的单词都可以按任何顺序组合。这意味着无法控制哪个单词先出现。示例
COMPOUNDFLAG c
spell-COMPOUNDRULE 一种更高级的方法来指定如何形成复合词是使用多个项目和多个标志。这与 Myspell 3.0 不兼容。让我们从一个例子开始
COMPOUNDRULE c+
COMPOUNDRULE se
第一行定义了具有 "c" 标志的单词可以按任何顺序连接。第二行定义了由一个具有 "s" 标志的单词和一个具有 "e" 标志的单词组成的复合词。使用此词典
bork/c
onion/s
soup/e
您可以创建以下单词:bork borkbork borkborkbork (等等)onion soup onionsoup
COMPOUNDRULE 项目可以多次出现。参数由一个或多个组组成,每个组可以是:一个标志,例如 c 括号内的一组备选标志,例如 [abc] 可选地,这后面可以跟着:* 该组出现零次或多次,例如 sm*e + 该组出现一次或多次,例如 c+ ? 该组出现零次或一次,例如 x?
这类似于正则表达式模式语法(但不完全相同!)。以下是一些示例,以及它们所需的单词标志序列:COMPOUNDRULE x+ x xx xxx 等等。 COMPOUNDRULE yz yz COMPOUNDRULE x+z xz xxz xxxz 等等。 COMPOUNDRULE yx+ yx yxx yxxx 等等。 COMPOUNDRULE xy?z xz xyz
COMPOUNDRULE [abc]z az bz cz COMPOUNDRULE [abc]+z az aaz abaz bz baz bcbz cz caz cbaz 等等。 COMPOUNDRULE a[xyz]+ ax axx axyz ay ayx ayzz az azy azxy 等等。 COMPOUNDRULE sm*e se sme smme smmme 等等。 COMPOUNDRULE s[xyz]*e se sxe sxye sxyxe sye syze sze szye szyxe 等等。
一个具体的例子:允许一个复合词由两个词和一个连字符组成:在 .aff 文件中
COMPOUNDRULE sde
NEEDAFFIX x
COMPOUNDWORDMAX 3
COMPOUNDMIN 1
在 .dic 文件中
start/s
end/e
-/xd
这样就可以使用 "start-end" 这个词,但不能使用 "startend"。
如果省略,则没有最小长度。显然,你也可以直接从短词中省略复合词标志,这个功能是为了与 Myspell 兼容。
如果省略,则没有最大值。它适用于所有复合词。
要设置对带有特定标志的词的限制,请确保 COMPOUNDRULE 中的项目在这些标志出现的地方不允许太多词。
如果不存在 SYLLABLE 项目,则这不会有任何影响。如果没有 COMPOUNDSYLMAX,则对音节数没有限制。
如果同时定义了 COMPOUNDWORDMAX 和 COMPOUNDSYLMAX,则如果一个复合词符合其中一个标准,则接受该复合词,因此,该复合词要么由最多 COMPOUNDWORDMAX 个词组成,要么包含最多 COMPOUNDSYLMAX 个音节。
spell-COMPOUNDFORBIDFLAG COMPOUNDFORBIDFLAG 指定一个可以用于附加词的标志。这意味着词加附加词不能用在复合词中。例如:附加词文件
COMPOUNDFLAG c
COMPOUNDFORBIDFLAG x
SFX a Y 2
SFX a 0 s .
SFX a 0 ize/x .
dictionary
word/c
util/ac
这样就可以使用 "wordutil" 和 "wordutils",但不能使用 "wordutilize"。注意:这还不能用于推迟的前缀。
spell-COMPOUNDPERMITFLAG COMPOUNDPERMITFLAG 指定一个可以用于附加词的标志。这意味着词加附加词也可以用在复合词中,附加词最终会出现在词的中间。如果没有这个标志,这是不允许的。
注意:这还不能用于推迟的前缀。
spell-COMPOUNDROOT COMPOUNDROOT 标志用于字典中已经是复合词的词。这意味着在检查复合词规则时,它算作两个词。也可以用于附加词,将附加词算作一个复合词。
这禁止了如果第一个词以 "o" 结尾,而第二个词以 "e" 开头时的复合。
参数必须是纯文本,尽管项目名称如此,实际上并不支持任何模式。始终忽略大小写。
不支持使用三个参数和标志的 Hunspell 功能。
spell-NOCOMPOUNDSUGS 此项表示使用复合词来生成建议不是一个好主意。当使用非常短的词或单个字符的词进行复合时,请使用此选项。例如,用数字来构成数字。如果没有这个标志,生成建议会花费大部分时间尝试各种奇怪的复合词。
spell-SYLLABLE SYLLABLE 项目定义用于计算一个词中音节数的字符或字符序列。例如
SYLLABLE aáeéiíoóöõuúüûy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui
第一个斜杠之前的字符集用于计算一个音节,即使重复和混合也是如此,直到出现下一个不在此字符集中的字符。斜杠后的字符序列用于计算一个音节。这些优先于使用字符集中的字符。以 "ideeen" 为例,它有三个音节,分别由 "i"、"ee" 和 "e" 计算。
只需要包含大小写折叠的字母。
对于某些语言,例如泰语,词语之间没有空格。看起来所有词语都是复合词。要指定这一点,请在附加词文件中使用 NOBREAK 项目,没有参数
NOBREAK
Vim 会尝试找出单词在哪里结束,下一个单词在哪里开始。如果存在拼写错误,这可能并不完全正确。
COMMON the of to and a in is it you that he she was for on are
词语之间必须用空格隔开,每行最多 25 个词。当在 ":mkspell" 命令中指定多个区域时,所有区域的常用词都会被组合起来,并用于所有区域。
在附加词文件中,REP 项目可以用来定义常见的错误。这用于生成拼写建议。这些项目定义了 "from" 文本和 "to" 替换。例如
REP 4
REP f ph
REP ph f
REP k ch
REP ch k
第一行指定了后面 REP 行的数量。Vim 忽略了这个数字,但它必须存在(为了与 Myspell 兼容)。
不要包含简单的单字符替换或交换。Vim 会尝试这些操作。你也可以包含整个词语,但你可能想在
'spellsuggest' 中使用 "file:" 项目。
你可以用下划线来包含空格
在附加词文件中,MAP 项目可以用来定义非常相似的字母。这主要用于带不同重音的字母。这用于优先考虑用这些字母替换的建议。例如
第一行指定了后面 MAP 行的数量。Vim 忽略了这个数字,但这一行必须存在。
每个字母只能出现在一个 MAP 项目中。如果第一个字母是 ASCII 或者至少是一个没有重音的字母,效率会更高。
当在附加词文件中指定了音调折叠时,":mkspell" 通常会在 .spl 文件旁边生成一个 .sug 文件。此文件用于通过单词的同音形式快速找到建议。以大量内存为代价(内存量取决于单词的数量,
:mkspell 在完成时会显示一个估计值)。
要避免生成 .sug 文件,请在附加词文件中使用此项目
用户可以在不想使用 .sug 文件的情况下直接将其省略。
在附加词文件中,SAL 项目可以用来定义要使用的同音词机制。主要项目定义了 "from" 文本和 "to" 替换。一个简单的例子
SAL CIA X
SAL CH X
SAL C K
SAL K K
有一些特殊的项目
SAL followup true
SAL collapse_result true
SAL remove_accents true
"1" 与 "true" 具有相同的含义。任何其他值都表示 "false"。
SAL 机制很复杂而且很慢。一个更简单的机制是将所有字符映射到另一个字符,将发音相似的字符映射到同一个字符。同时,它还进行大小写折叠。你不能同时使用 SAL 项目和简单音调折叠。
需要两个项目:一个用来指定要映射的字符,另一个用来指定要映射到的字符。它们必须有完全相同的字符数。例如
SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkes
在这个例子中,所有元音都被映射到同一个字符 'e'。另一种方法是省略所有元音。一些发音几乎相同且经常混淆的字符,例如 'm' 和 'n',被映射到同一个字符。不要这样做太多,所有单词都会开始看起来很相似。
不包含在 SOFOFROM 中的字符将被省略,但所有空格将被替换为一个空格。SOFOFROM 中相同的字符序列将被替换为一个字符。
这些项目出现在其他拼写检查器的附加词文件中。在 Vim 中,它们会被忽略,不支持或以其他方式定义。
KEY (Hunspell)
spell-KEY定义键盘上彼此靠近的字符。用于提供更好的建议。不支持。
LANG (Hunspell)
spell-LANG这指定了特定语言的行为。这实际上将部分语言知识移到了程序中,因此 Vim 不支持它。每个语言属性必须单独指定。
TRY (Myspell, Hunspell, 其他)
spell-TRYVim 不使用 TRY 项目,它被忽略。为了生成建议,实际使用单词中的字符,这更加高效。
WORDCHARS (Hunspell)
spell-WORDCHARS用于识别单词。Vim 不需要它,因为在检查单词之前无需分离单词(使用字典树而不是哈希表)。
当拼写检查即将添加到 Vim 时,对可用的拼写检查库和程序进行了调查。不幸的是,结果表明,由于各种原因,没有一个能够提供足够的功能来用作 Vim 中的拼写检查引擎。
缺少对多字节编码的支持。至少必须支持 UTF-8,以便在同一个文件中可以使用多种语言。进行动态转换并不总是可行(需要 iconv 支持)。
对于程序和库:按原样使用它们将需要单独安装它们,而不是 Vim。这大多不是不可能,但这是一个缺点。
性能:一些测试表明,可以在动态(重新绘制的同时)进行拼写检查,就像语法高亮一样。但其他代码使用的机制要慢得多。例如,Myspell 使用哈希表。大多数拼写检查器使用的词缀压缩也会使其变慢。
对于使用像 aspell 这样的外部程序,必须设置通信机制。这很难以一种便携的方式实现(Unix 专属会相对简单,但这还不够好)。而且性能会成为问题(涉及大量进程切换)。
缺少对包含非单词字符的单词的支持,例如 "Etten-Leur" 和 "et al.",将需要标记它们的片段为正常,降低可靠性。
缺少对区域或方言的支持。难以接受所有英语单词并将非加拿大单词以不同的方式突出显示。
缺少对生僻词的支持。许多单词是正确的,但很少使用,并且可能被拼错的常用词。
对于生成建议,速度不那么重要,需要安装另一个程序或库是可以接受的。但词典可能不同,建议可能是错误的词。
对于生成建议,有两种基本机制:1. 尝试稍微改变错误的单词,并检查它是否与正确的单词匹配。或者遍历正确的单词列表,稍微改变它们,并检查它们是否与错误的单词匹配。这些更改包括删除字符、插入字符、交换两个字符等等。2. 对错误的单词和正确的单词都执行发音折叠,然后查找匹配项,可能还进行一些类似于第一种机制的更改。
第一种方法非常适合查找打字错误。在尝试过哈希表并查看过其他拼写检查器的解决方案后,得出的结论是字典树(一种树结构)非常适合此目的。既可以减少内存使用,又可以尝试合理的更改。例如,当插入字符时,只需要尝试导致正确单词的字符。其他机制(使用哈希表)需要在单词中的每个位置尝试所有可能的字母。此外,哈希表要求单独识别单词边界,而字典树不需要。这使得机制更加简单。
发音折叠对于知道单词发音但不确定其拼写的人来说非常有用。例如,"dictionary" 这个词可能被写成 "daktonerie"。第一种方法需要尝试的更改数量非常多,很难找到正确的单词。发音折叠后,单词变为 "tktnr" 和 "tkxnry",它们只相差两个字母。
为了通过其发音折叠后的等价物(同音词)查找单词,我们需要一个包含所有发音折叠后的单词的列表。已经进行了一些实验来确定最佳方法。备选方案:1. 在寻找建议时动态进行发音折叠。这意味着遍历正确单词的字典树,对每个单词进行发音折叠,并检查它与错误单词的差异。这对内存使用非常有效,但需要很长时间。在速度快的 PC 上,英语需要几秒钟,对于交互式使用来说可以接受。但对于一些语言来说,需要超过 10 秒(例如,德语、加泰罗尼亚语),这太慢了。对于批处理(自动更正),对所有语言来说都太慢了。2. 对发音折叠后的单词使用字典树,以便搜索可以像没有发音折叠一样工作。这需要记住每个发音折叠后的单词的正确单词列表。这使得查找匹配项非常快,但需要相当多的内存,大约 1 到 10 兆字节。对于一些语言来说,比原始单词列表还要多。3. 类似于第二个备选方案,但通过使用词缀压缩来减少内存使用量,只存储发音折叠后的基本词。这就是 Aspell 的做法。缺点是需要在对错误的单词进行发音折叠之前从其剥离词缀,这意味着单词开头和/或结尾处的错误会导致机制失效。此外,当错误的单词与正确的单词相差很大时,这会变得很慢。
最终选择是使用第二种机制,并使用一个单独的文件。这样,内存充足的用户可以获得非常好的建议,而内存不足或只是想要拼写检查而不需要建议的用户就不会使用那么多内存。
词频
对于对建议进行排序,了解哪些单词很常见会有所帮助。理论上,我们可以将词频与词典中的单词一起存储。但是,这需要为每个单词存储一个计数。这会严重降低单词树压缩的效率。维护所有语言的词频将是一项繁重的任务。此外,如果能优先考虑文本中已经存在的单词会更好。这样,文本中出现的特定单词将成为建议的优先选择。
已实现的是对显示期间看到的单词进行计数。使用哈希表可以快速查找单词计数。计数从词缀文件中 COMMON 项目中列出的单词初始化,因此即使是开始一个新文件也能正常工作。
这不是理想的,因为 Vim 运行的时间越长,计数就越高。但在实践中,它比不使用单词计数要好得多。