拼寫檢查

Nvim 的 :help 頁面,使用 tree-sitter-vimdoc 解析器,從 原始碼產生


拼寫檢查

1. 快速開始 spell-quickstart E756

此命令開啟拼寫檢查功能
:setlocal spell spelllang=en_us
這會開啟 'spell' 選項,並指定檢查美式英語。
無法識別的單字會以以下其中一種方式醒目提示:SpellBad 無法識別的單字 hl-SpellBad SpellCap 單字未大寫 hl-SpellCap SpellRare 罕見單字 hl-SpellRare SpellLocal 所選區域的錯誤拼寫 hl-SpellLocal
Vim 只檢查單字的拼寫,沒有文法檢查。
如果 'mousemodel' 選項設定為 "popup" 且游標位於拼寫錯誤的單字上,或是設定為 "popup_setpos" 且滑鼠指標位於拼寫錯誤的單字上,則彈出選單將包含一個子選單來取代錯誤的單字。 注意:這會減慢彈出選單的出現速度。
搜尋下一個拼寫錯誤的單字
]s
]s 移動到游標之後的下一個拼寫錯誤的單字。可以在命令之前使用計數來重複。套用 'wrapscan'
[s
[s 類似 "]s",但反向搜尋,尋找游標之前的拼寫錯誤的單字。無法識別跨兩行的單字,因此可能會在未醒目提示為錯誤的單字處停止。不會在行首遺漏大寫字母的單字處停止。
]S
]S 類似 "]s",但只會在錯誤的單字處停止,而不會在罕見的單字或另一個區域的單字處停止。
[S
[S 類似 "]S",但反向搜尋。
]r
]r 移動到游標之後的下一個「罕見」單字。可以在命令之前使用計數來重複。套用 'wrapscan'
[r
[r 類似 "]r",但反向搜尋,尋找游標之前的「罕見」單字。無法識別跨兩行的單字,因此可能會在未醒目提示為罕見的單字處停止。
將單字新增至您自己的單字列表
zg
zg 將游標下的單字新增為 'spellfile' 中第一個名稱的好單字。可以在命令之前使用計數來指示要使用的 'spellfile' 中的條目。計數為二則使用第二個條目。
在視覺模式中,選取的字元會新增為一個單字(包括空白!)。當游標位於標記為拼寫錯誤的文字上時,會使用標記的文字。否則,會使用游標下以非單字字元分隔的單字。
如果該單字在另一個拼寫檔案中明確標記為錯誤單字,則結果無法預測。
zG
zG 類似 "zg",但將單字新增至內部單字列表 internal-wordlist
zw
zw 類似 "zg",但將單字標記為錯誤(壞)單字。如果該單字已出現在 'spellfile' 中,則會變成註解行。請參閱 spellfile-cleanup 以清除這些行。
zW
zW 類似 "zw",但將單字新增至內部單字列表 internal-wordlist
zuw zug zuw zug 還原 zwzg,從 'spellfile' 中的條目移除單字。計數的使用方式與 zg 相同。
zuW zuG zuW zuG 還原 zWzG,從內部單字列表移除單字。計數的使用方式與 zg 相同。
:spe :spellgood E1280 :[count]spe[llgood] {word}{word} 新增為 'spellfile' 中的好單字,如同使用 zg。如果沒有計數,則使用第一個名稱,計數為二則使用第二個條目,依此類推。
:spe[llgood]! {word}{word} 新增為內部單字列表中的好單字,如同使用 zG
:spellw :spellwrong :[count]spellw[rong] {word}{word} 新增為 'spellfile' 中的錯誤(壞)單字,如同使用 zw。如果沒有計數,則使用第一個名稱,計數為二則使用第二個條目,依此類推。
:spellw[rong]! {word}{word} 新增為內部單字列表中的錯誤(壞)單字,如同使用 zW
:spellra :spellrare :[count]spellra[re] {word}{word} 新增為 'spellfile' 中的罕見單字,類似於 zw。如果沒有計數,則使用第一個名稱,計數為二則使用第二個條目,依此類推。
沒有一般的模式命令可以將單字標記為罕見,因為這是一個相當不常用的命令,而且所有直觀的命令都已被佔用。如果需要,可以使用例如
nnoremap z?  :exe ':spellrare  ' .. expand('<cWORD>')<CR>
nnoremap z/  :exe ':spellrare! ' .. expand('<cWORD>')<CR>
:spellundozuwzuW 來還原此操作。
:spellra[re]! {word}{word} 新增為內部單字列表中的罕見單字,類似於 zW
:[count]spellu[ndo] {word} :spellu :spellundo 類似 zuw。[count] 的使用方式與 :spellgood 相同。
:spellu[ndo]! {word} 類似 zuW。[count] 的使用方式與 :spellgood 相同。
使用上述命令將單字新增至 'spellfile' 後,其相關聯的 ".spl" 檔案會自動更新並重新載入。如果您手動變更 'spellfile',則需要使用 :mkspell 命令。此命令序列大多運作良好
:edit <file in 'spellfile'>
(對拼寫檔案進行變更)
:mkspell! %
關於 'spellfile' 格式的更多詳細資訊,請參閱 spell-wordlist-format
internal-wordlist
內部單字列表用於所有設定了 'spell' 的緩衝區。它不會被儲存,當您退出 Vim 時會遺失。當設定 'encoding' 時也會清除它。
尋找錯誤單字的建議:z=
z= 對於游標下/後的單字,建議正確拼寫的單字。這也適用於尋找未醒目提示為錯誤單字的單字的替代方案,例如,當其後的單字錯誤時。在視覺模式中,會將醒目提示的文字視為要取代的單字。結果會依與要取代的單字的相似度排序。這可能需要很長時間。當您感到厭煩時,請按下 CTRL-C
如果命令未使用計數,則會列出替代方案,您可以輸入您選擇的數字,或是如果您不想取代,請按下 <Enter>。您也可以使用滑鼠點擊您的選擇(僅當滑鼠可以在一般模式中使用,且沒有換行時才有效)。點擊第一行(標題)即可取消。
列出的建議通常會取代醒目提示的錯誤單字。有時它們會包含其他文字,在這種情況下,取代的文字也會在 "<" 之後列出。
如果使用計數,則會使用該建議,而不會提示。例如,"1z=" 一律會採用第一個建議。
如果 'verbose' 為非零值,則會顯示分數以及建議,以指示與拼寫錯誤的單字的相似度(分數越高,差異越大)。當取代單字時,重做命令 "." 將重複單字取代。其運作方式類似 "ciw"、好單字和 <Esc>。這不適用於泰語和其他單字之間沒有空格的語言。
:spellr :spellrepall E752 E753 :spellr[epall] 重複執行由 z= 完成的取代,適用於目前視窗中所有與被取代單字相符的項目。
在插入模式中,當游標位於拼寫錯誤的單字之後時,可以使用 CTRL-X s 來尋找建議。其運作方式類似插入模式完成。使用 CTRL-N 來使用下一個建議,CTRL-P 回退。i_CTRL-X_s
'spellsuggest' 選項會影響建議列表的產生和排序方式。請參閱 'spellsuggest'
'spellcapcheck' 選項用於檢查句子的第一個單字是否以大寫字母開頭。這不適用於檔案中的第一個單字。當句子後緊接著換行時,下一行的醒目提示可能會延遲。請在需要時使用 CTRL-L。另請參閱 set-spc-auto,了解如何在使用 'spelllang' 時自動設定。
'spelloptions' 選項有一些其他旗標會影響拼寫檢查的運作方式。例如,「camel」會分割 CamelCased 單字,以便單字的每個部分都單獨進行拼寫檢查。
Vim 會計算遇到好單字的次數。這用於對建議進行排序:之前看過的單字會獲得小額獎勵,經常看過的單字會獲得較大的獎勵。詞綴檔案中的 COMMON 項目可用於定義常用單字,以便此機制也能在新的或短小的檔案中運作 spell-COMMON

2. 關於拼寫檢查的說明 spell-remarks

效能

Vim 會進行即時拼寫檢查。為了使其快速運作,單字列表會載入記憶體中。因此,這會使用大量的記憶體(1 MB 或更多)。當載入單字列表時,也可能會出現明顯的延遲,這會在設定 'spell' 以及在 'spell' 已設定時設定 'spelllang' 時發生。為了將延遲降至最低,每個單字列表只會載入一次,當 'spelllang' 變為空或重設 'spell' 時,不會刪除它。當設定 'encoding' 時,會重新載入所有單字列表,因此您也可能會注意到延遲。

區域

一個單字在不同區域的拼寫可能不同。例如,英語(至少)有以下變體
en 所有地區 en_au 澳洲 en_ca 加拿大 en_gb 英國 en_nz 紐西蘭 en_us 美國
在一個區域未使用但在另一個區域使用的單字會以 SpellLocal hl-SpellLocal 醒目提示。
語言和地區名稱一律使用小寫字母。
使用 zg 或其他命令新增單字時,一律會針對所有區域新增。您可以透過手動編輯 'spellfile' 來變更此設定。請參閱 spell-wordlist-format。請注意,只有當 'spelllang' 中的所有條目指定相同的區域(不計算以 .spl 名稱指定的檔案)時,才會使用 'spellfile' 中檔案中指定的區域。
拼寫檢查-德語
特殊例外:對於德語,使用以下特殊區域:de 接受所有德語單詞 de_de 新舊拼寫 de_19 舊拼寫 de_20 新拼寫 de_at 奧地利 de_ch 瑞士
拼寫檢查-俄語
特殊例外:對於俄語,使用以下特殊區域:ru 接受所有俄語單詞 ru_ru 「IE」字母拼寫 ru_yo 「YO」字母拼寫
拼寫檢查-意第緒語
意第緒語需要使用「utf-8」編碼,因為它使用了特殊字元。如果您使用 latin1,Vim 將使用音譯(羅馬化)的意第緒語。如果您想使用帶有 utf-8 的音譯意第緒語,請使用「yi-tr」。在表格中:'encoding' 'spelllang' utf-8 yi 意第緒語 latin1 yi 音譯的意第緒語 utf-8 yi-tr 音譯的意第緒語
拼寫檢查-CJK
中文、日文和其他東亞字元通常會被標記為錯誤,因為不支援這些字元的拼寫檢查。如果 'spelllang' 包含「cjk」,則這些字元不會被標記為錯誤。這在編輯帶有拼寫檢查的文本且其中存在一些亞洲單詞時很有用。

拼寫檔案 spell-load

Vim 會在 'runtimepath' 中目錄的「spell」子目錄中搜尋拼寫檔案。檔案名稱為:LL.EEE.spl,其中:LL 為語言名稱 EEE 為 'encoding' 的值
「LL」的值來自 'spelllang',但不包含區域名稱。範例en_us en en-rare en-rare medical_ca medical
只會載入第一個檔案,也就是在 'runtimepath' 中最先找到的那個。如果此步驟成功,則會額外載入名稱為 LL.EEE.add.spl 的檔案。所有找到的檔案都會被使用。
如果找不到拼寫檔案,則會觸發 SpellFileMissing 自動指令事件。這可能會觸發 spellfile.vim 外掛程式來提供您下載拼寫檔案。
此外,也會載入與 'spellfile' 中名稱相關的檔案。這些檔案是 zgzw 將正確和錯誤的單詞新增到的檔案。
例外
'encoding' 為「iso-8859-15」時,Vim 會使用「latin1」。歐元符號對於拼寫來說並不重要。
如果找不到 'encoding' 的拼寫檔案,則會嘗試「ascii」。這僅適用於幾乎所有單詞都是 ASCII 的語言,例如英語。當 'encoding' 不是「latin1」,例如 iso-8859-2,並且正在編輯英文文本時,這會很有幫助。對於「.add」檔案,會使用找到的主拼寫檔案的相同名稱。
例如,使用以下值:'runtimepath' 為「~/.config/nvim,/usr/share/nvim/runtime/,~/.config/nvim/after」'encoding' 為「iso-8859-2」'spelllang' 為「pl」
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 字元的情況下,波蘭語沒有意義)。
目前的 'encoding' 中可能沒有可用的拼寫檔案。請參閱 spell-mkspell 關於如何建立拼寫檔案。使用「iconv」轉換拼寫檔案將無法運作!
spell-sug-file E781 如果存在與「.spl」檔案名稱完全相同,但結尾為「.sug」的檔案,則該檔案將用於提供更好的建議。它不會在產生建議之前載入,以減少記憶體使用量。
E758 E759 E778 E779 E780 E782 載入拼寫檔案時,Vim 會檢查其格式是否正確。如果出現錯誤,則該檔案可能已遭截斷、修改或用於其他 Vim 版本。

拼寫檔案清理 spellfile-cleanup

zw 命令會將 'spellfile' 中的現有條目轉換為註解行。這可以避免每次都必須寫入新檔案,但會導致檔案只會變長,永遠不會變短。若要清除所有「.add」拼寫檔案中的註解行,請執行以下操作
:runtime spell/cleanadd.vim
這會刪除所有註解行,但以「##」開頭的註解行除外。使用「##」行來新增您想要保留的註解。
您可以根據需要多次調用此指令碼。提供了一個變數來跳過更新最近已變更的檔案。將其設定為檔案變更後經過的秒數,然後才會清理該檔案。例如,若要僅清理在最近一小時內未變更的檔案
let g:spell_clean_limit = 60 * 60
預設值為一秒。

單字

Vim 使用固定的方法來識別單字。這與 'iskeyword' 無關,因此它也可以在說明檔案中以及對於在 'iskeyword' 中包含「-」等字元的語言中運作。單字字元取決於 'encoding'
單字字元表儲存在主要的 .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 程式碼中的註解進行拼寫檢查。

語法醒目提示 spell-syntax

使用語法醒目提示的檔案可以指定應在何處進行拼寫檢查
1. 預設為所有位置 2. 在特定項目中使用「contains=@Spell」 3. 除了特定項目之外的所有位置,使用「contains=@NoSpell」
對於第二種方法,新增 @NoSpell 叢集將再次停用拼寫檢查。例如,這可以用於將 @Spell 新增至程式的註解,並為不應檢查的項目新增 @NoSpell。另請參閱 :syn-spell,以取得不在語法項目中的文字。

VIM 指令碼

如果您想要編寫使用拼寫執行某些操作的 Vim 指令碼,您可能會發現這些函式很有用
spellbadword() 尋找游標處拼寫錯誤的單字 spellsuggest() 取得拼寫建議清單 soundfold() 取得單字的發音相似版本
成功設定 'spelllang' 選項後,Vim 將會在 'runtimepath' 中載入檔案「spell/LANG.vim」和「spell/LANG.lua」。「LANG」是 'spelllang' 的值,直到第一個逗號、點或底線。這可以用於設定語言特定的選項,特別是 'spellcapcheck'
發行版本包含一些這些檔案。使用此命令來查看它們的作用
:next $VIMRUNTIME/spell/*.vim
請注意,如果 'spellcapcheck' 從預設值變更,則預設指令碼不會設定它。這假設使用者喜歡其他值。
可以使用 'spellsuggest' 選項來選取「雙重」計分。此機制基於兩種拼寫錯誤的原則
1. 您知道如何拼寫單字,但輸入錯誤。這會導致小的編輯距離(字元交換/省略/插入),並且可能會導致單字聽起來完全不同。
2. 您不知道如何拼寫單字,然後輸入聽起來正確的單字。編輯距離可能很大,但在發音折疊後,單字是相似的。
由於這兩種錯誤的分數會非常不同,因此我們對每個錯誤使用清單並將它們混合。
發音折疊速度很慢,並且知道該語言的人不會犯第二種錯誤。因此,可以設定 'spellsuggest' 來選取建議計分的偏好方法。

3. 產生拼寫檔案 spell-mkspell

Vim 使用二進位檔案格式進行拼寫檢查。這大大加快了載入單字清單的速度並使其保持較小。.aff .dic Myspell 您可以使用 Myspell 使用的 .aff 和 .dic 檔案來建立 Vim 拼寫檔案。Myspell 由 OpenOffice.org 和 Mozilla 使用。OpenOffice .oxt 檔案是包含 .aff 和 .dic 檔案的 zip 檔案。您應該可以在這裡找到它們:https://extensions.services.openoffice.org/dictionary 如果這不起作用,可以使用較舊的 OpenOffice 2 檔案:http://wiki.services.openoffice.org/wiki/Dictionaries 您也可以使用純文字單字清單。結果是相同的,選擇取決於您可以找到的單字清單。
如果您安裝 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
此命令會使用大量的記憶體,用於尋找最佳的單字樹(波蘭語、義大利語和匈牙利語需要數百 MB)。最終的結果將會小得多,因為會使用壓縮。為了避免記憶體不足,會不時進行壓縮。可以使用 '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. 如果您將它寫入 'runtimepath' 中的拼寫目錄中,請使用 ":set spell spelllang=xx" 來測試拼寫檔案,或者如果您將它寫在其他地方,請使用 ":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。

拼寫檔案版本 E770 E771 E772

拼寫檢查是 Vim 中相對較新的功能,因此 .spl 檔案格式可能會變更以支援更多語言。Vim 將會檢查拼寫檔案的有效性並報告任何錯誤。
E771: 拼寫檔案過舊,需要更新
此拼寫檔案比您的 Vim 版本舊。您需要更新 .spl 檔案。
E772: 拼寫檔案適用於較新版本的 Vim
這表示此拼寫檔案是為較新版本的 Vim 所建立。您需要更新 Vim。
E770: 拼寫檔案中不支援的區段
這表示此拼寫檔案是為較新版本的 Vim 所建立,並且包含拼寫檔案運作所需的區段。在這種情況下,最好升級您的 Vim。

拼寫檔案傾印

如果由於某些原因您想檢查目前使用的拼寫檔案支援哪些單字,請使用此命令:
:spelldump :spelld :spelld[ump] 開啟一個新視窗,並填入目前所有有效的單字。不包含複合單字。注意:對於某些語言,結果可能非常龐大,導致 Vim 記憶體不足。
:spelld[ump]! 類似於 ":spelldump",並包含單字計數。這是更新螢幕時找到該單字的次數。在 COMMON 項目中的單字會獲得 10 的起始計數。
單字列表的格式使用 spell-wordlist-format。您應該可以使用 ":mkspell" 讀取它,以產生一個包含所有單字的 .spl 檔案。
'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 自動命令不得變更或損毀使用者正在編輯的緩衝區。

4. 拼寫檔案格式 spell-file-format

這是建立和維護單字列表的人員使用的檔案格式。
請注意,我們在這裡避免使用「字典」一詞。那是因為拼寫檢查的目的與編寫字典(如書中所示)不同。對於拼寫檢查,我們需要一個 OK 單字列表,因此不應該被強調顯示。人名和公司名稱不會出現在字典中,但會出現在單字列表中。而且,一些舊單字很少使用,但它們是常見的拼寫錯誤。這些會出現在字典中,但不會出現在單字列表中。
有兩種格式:直接單字列表和使用詞綴壓縮的列表。使用詞綴壓縮的檔案由 Myspell(Mozilla 和 OpenOffice.org)使用。這需要兩個檔案,一個是 .aff 副檔名,另一個是 .dic 副檔名。

直接單字列表的格式 spell-wordlist-format

單字必須每個都出現在一行。這是唯一的要求。
此外,會辨識以下項目:
會忽略空白和空行。
# 註解
開頭為 # 的行會被忽略(註解行)。
/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/= 保留大小寫字詞
請注意,當使用「/=」時,不接受所有大寫字母的相同字詞。這與自動標記為保留大小寫的混合大小寫字詞不同,這些字詞可能會以所有大寫字母的形式出現。

使用 .AFF 和 .DIC 檔案的格式 aff-dic-format

有兩個檔案:基本字詞列表和詞綴檔案。詞綴檔案指定語言的設定,並可以包含詞綴。詞綴用於修改基本字詞以取得完整的字詞列表。這大大減少了字詞數量,特別是像波蘭語這樣的語言。這稱為詞綴壓縮。
基本字詞列表和詞綴檔案會與「:mkspell」命令結合,產生二進位拼字檔案。所有預處理都已完成,因此此檔案載入速度很快。二進位拼字檔案格式在原始碼 (src/spell.c) 中說明。但只有開發人員需要知道它。
預處理也允許我們在建立 Vim 字詞列表之前,取得 Myspell 語言檔案並修改它們。此工具可在「src/spell」目錄中找到。
詞綴和字詞列表檔案的格式基於 Myspell 使用的格式(Mozilla 和 OpenOffice.org 的拼字檢查器)。可以在這裡找到說明:https://lingucomponent.openoffice.org/affix.readme 請注意,詞綴區分大小寫,這在說明中並不顯著。
Vim 支援相當多的額外功能。它們在下面 spell-affix-vim 中說明。已經嘗試保持與其他拼字檢查器的相容性,以便通常可以使用相同的檔案。另一個提供比 Myspell 更多功能的專案是 Hunspell (https://hunspell.github.io)。

字詞列表格式 spell-dic-format

一個簡短範例,附帶行號
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。請注意,不允許在字詞後面加上註解
someword # 導致錯誤的註解!
在字詞後面有一個可選的斜線和旗標。大多數這些旗標是字母,表示可用於此字詞的詞綴。這些在 .aff 檔案中使用 SFX 和 PFX 行指定,請參閱 spell-SFXspell-PFX。Vim 允許在詞綴檔案中使用 FLAG 項目使用其他旗標類型 spell-FLAG
當字詞只有小寫字母時,它也會與以大寫字母開頭的字詞匹配。
當字詞包含大寫字母時,這表示在此位置需要大寫字母。在此位置使用小寫字母的相同字詞將不匹配。當其他一些字母是大寫時,它也不會匹配。
所有大寫字元的字詞永遠都是 OK 的,
字詞列表 匹配 不匹配
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
KEEPCASE 詞綴 ID 可用於專門匹配僅具有相同大小寫的字詞,請參閱下文 spell-KEEPCASE
注意:在第 5 至 7 行中,使用了非字詞字元。您可以在字詞中包含任何字元。當檢查文字時,只有當它在前後帶有非字詞字元時,字詞才會匹配。對於 Myspell 來說,以非字詞字元開頭的字詞可能無法運作。
在第 12 行中,定義了字詞「TCP/IP」。由於斜線具有特殊意義,因此改用逗號。這在詞綴檔案中使用 SLASH 項目定義,請參閱 spell-SLASH。請注意,如果沒有此 SLASH 項目,字詞將為「TCP,IP」。
spell-affix-comment
.aff 檔案中的註解行以「#」開頭
# 註解行
具有固定數量引數的項目後面可以跟著註解。但前提是沒有任何引數可以包含空白。註解必須以「#」字元開頭。範例
KEEPCASE = # 修復此旗標字詞的大小寫

編碼 spell-SET

詞綴檔案可以使用「iconv」支援的任何編碼。但是,在某些情況下,呼叫 :mkspell 時也應正確設定目前的地區設定。新增 FOL/LOW/UPP 行會移除此要求 spell-FOL
編碼應在任何編碼重要的內容之前指定。編碼同時適用於詞綴檔案和字典檔案。它是使用 SET 行完成的
SET utf-8
編碼可以與使用「:mkspell」時的 'encoding' 選項值不同。然後,Vim 會將所有內容轉換為 'encoding',並為 'encoding' 產生拼字檔案。如果某些使用的字元不符合 'encoding',您將收到錯誤訊息。spell-affix-mbyte
使用多位元組編碼時,可以使用更多不同的詞綴旗標。但 Myspell 不支援該功能,因此您可能不想使用它。為了保持相容性,請使用 8 位元編碼。

資訊

詞綴檔案中的這些項目可用於將資訊新增到拼字檔案。格式沒有限制,但它們應採用正確的編碼。
spell-NAME spell-VERSION spell-HOME spell-AUTHOR spell-EMAIL spell-COPYRIGHT NAME 語言名稱 VERSION 1.0.1 包含修正 HOME https://www.example.com AUTHOR John Doe EMAIL john AT Doe DOT net COPYRIGHT LGPL
這些欄位會依原樣放入 .spl 檔案中。:spellinfo 命令可用於檢視資訊。
:spellinfo :spelli :spelli[nfo] 顯示用於目前緩衝區的拼字檔案的資訊。

字元表

spell-affix-chars
當使用 8 位元編碼時,詞綴檔案應定義哪些字元是字詞字元。這是因為使用「:mkspell」的系統可能不支援使用此編碼的地區設定,並且 isalpha() 將無法運作。例如,在 Unix 上使用「cp1250」時。E761 E762 spell-FOL spell-LOW spell-UPP 需要詞綴檔案中的三行。簡化範例
FOL áëñ
LOW áëñ
UPP ÁËÑ
所有三行必須具有完全相同的字元數。
「FOL」行指定折疊大小寫的字元。這些用於比較字詞,同時忽略大小寫。對於大多數編碼,這與小寫行相同。
「LOW」行指定小寫字元。它大多與「FOL」行相同。
「UPP」行指定大寫字元。也就是說,當字元與「FOL」中相同位置的字元不同時,該字元為大寫。
德國銳音符號 ß 例外。大寫版本為「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 定義。範例
MIDWORD '-

標記類型 spell-FLAG

標記用於指定可以與單字一起使用的詞綴,以及單字的其他屬性。通常使用單字元標記。這限制了可能的標記數量,特別是對於 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 個。
支援常用的 PFX(字首)和 SFX(字尾)行(請參閱 Myspell 文件或 Aspell 手冊:http://aspell.net/man-html/Affix-Compression.html)。
摘要
SFX L Y 2
SFX L 0 re [^x]
SFX L 0 ro x
第一行是標頭,有四個欄位:SFX {flag} {combine} {count}
{flag} 用於字尾的名稱。大多數情況下,它是一個字母,但也可以使用其他字元,請參閱 spell-FLAG
{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 1 S
SFX a 0 an .
SFX a Y 2 S
SFX a 0 en .
SFX a 0 on .

詞綴標記 spell-affix-flags

這是來自 Hunspell 的一項功能:詞綴可以指定標記。這與基本單字上指定的標記類似。標記適用於基本單字加上詞綴(但有一些限制)。範例
SFX S Y 1
SFX S 0 s .
SFX A Y 1
SFX A 0 able/S .
當字典檔案包含 "drink/AS" 時,這些單字是可能的
drink drinks 使用 S 字尾 drinkable 使用 A 字尾 drinkables 使用 A 字尾,然後使用 S 字尾
通常,字尾的標記會新增至基本單字的標記中,兩者都用於單字加上字尾。但是,基本單字的標記僅在詞綴中使用一次,除非字首和字尾都支援組合,否則可以使用一個字首和一個字尾。
具體而言,詞綴標記可用於
字尾上的字尾,如上例所示。這僅適用一次,因此您可以在一個單字上使用兩個字尾(加上一個字首)。
通過使用 spell-RARE 標記,使帶有詞綴的單字變得罕見。
通過使用 spell-COMPOUNDFORBIDFLAG 標記,將帶有詞綴的單字排除在複合之外。
通過使用 spell-COMPOUNDPERMITFLAG,允許帶有詞綴的單字在詞綴一側成為複合單字的一部分。
使用 NEEDCOMPOUND 標記:單字加上詞綴只能用作複合單字的一部分。 spell-NEEDCOMPOUND
複合標記:單字加上詞綴可以在結尾、中間、開頭等位置成為複合單字的一部分。這些標記會與基本單字的標記結合使用。 spell-compound
NEEDAFFIX:需要另一個詞綴才能構成有效的單字。
CIRCUMFIX,如下文所述。

IGNOREEXTRA spell-IGNOREEXTRA

通常,Vim 對於不以 '#' 開頭的額外欄位會給出錯誤。這可以避免錯誤被忽略。但是,為 Myspell 或 Hunspell 建立的一些檔案可能包含許多帶有額外欄位的條目。使用 IGNOREEXTRA 標記以避免大量錯誤。

CIRCUMFIX spell-CIRCUMFIX

CIRCUMFIX 標記表示必須同時新增字首和字尾。如果字首具有 CIRCUMFIX 標記,則只能新增具有 CIRCUMFIX 標記的字尾,反之亦然。另一種方法是僅指定字尾,並為該字尾提供兩個標記:所需的字首和 NEEDAFFIX 標記。 spell-NEEDAFFIX

PFXPOSTPONE spell-PFXPOSTPONE

當詞綴檔案有非常多適用於許多單字的字首時,無法在記憶體中建立整個單字列表。這適用於希伯來語(所有單字的列表超過 1 GB)。在這種情況下,必須延遲應用字首。這會使拼字檢查變慢。它由 .aff 檔案中的此關鍵字表示
PFXPOSTPONE
只有沒有切割字串且沒有標記的字首才能延遲。具有切割字串或帶有標記的字首仍將包含在單字列表中。如果切割字串是一個字元且等於新增字串的最後一個字元,但為小寫,則是一個例外。因此,當使用切割字串來允許後面的單字以大寫字母開頭時。
帶有斜線的單字 spell-SLASH
斜線用於 .dic 檔案中,將基本單字與詞綴字母和其他標記分開。遺憾的是,這表示您無法在單字中使用斜線。因此,"TCP/IP" 不是一個單字,而是帶有標記 "IP" 的 "TCP"。要在單字中包含斜線,請在斜線之前放置反斜線:"TCP\/IP"。在極少數情況下,您想在單字中使用反斜線,則需要使用兩個反斜線。反斜線的任何其他用途都保留供將來擴展使用。

保留大小寫的單字 spell-KEEPCASE

在詞綴檔案中,可以使用 KEEPCASE 行來定義用於保留大小寫單字的詞綴名稱。範例
KEEPCASE =
此標記不受 Myspell 支援。它的意思是大小寫很重要。如果單字在句子開頭的第一個字母沒有使用大寫,則可以使用此標記。範例
字詞列表 匹配 不匹配
's morgens/= 's morgens 'S morgens 's Morgens 'S MORGENS 's Morgens 's Morgens 'S MORGENS 'S morgens 's morgens
當單字全部為大寫字母時,也可以使用此標記來避免單字匹配。

罕用字詞 spell-RARE

在詞綴檔中,可以使用 RARE 行來定義用於罕用字詞的詞綴名稱。例如:
RARE ?
罕用字詞會以不同於錯誤字詞的方式被突出顯示。這用於標示對於該語言來說是正確的,但幾乎不使用的字詞,並且無論如何都可能是打字錯誤。
這個標記也可以用在詞綴上,這樣基本字詞不會是罕用字詞,但是基本字詞加上詞綴就會是罕用字詞 spell-affix-flags。然而,如果這個字詞也以其他方式(例如在其他區域)作為正確的字詞出現,它就不會被標記為罕用字詞。

錯誤字詞 spell-BAD

在詞綴檔中,可以使用 BAD 行來定義用於錯誤字詞的詞綴名稱。例如:
BAD !
這可以用來排除原本會被視為正確的字詞。例如,在 .dic 檔中的 "the the"。
the the/!
一旦一個字詞被標記為錯誤字詞,就不會因為遇到相同的字詞作為正確的字詞而被撤銷。
這個標記也適用於帶有詞綴的字詞,因此可以用來將一整組相關的字詞標記為錯誤字詞。
spell-FORBIDDENWORD
FORBIDDENWORD 的用法與 BAD 相同。為了與 Hunspell 相容。
spell-NEEDAFFIX
NEEDAFFIX 標記用於要求一個字詞必須與詞綴一起使用。該字詞本身不是正確的字詞(除非存在一個空的詞綴)。例如:
NEEDAFFIX +

複合字詞 spell-compound

複合字詞是由 .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?
這類似於 regexp 模式語法(但不相同!)。一些帶有它們所需字詞標記序列的範例: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"。
另一個隱含的規則是,在沒有其他標記的情況下,具有前綴的字詞不能在另一個字詞之後進行複合,而具有後綴的字詞不能與後面的字詞進行複合。因此,詞綴不能出現在複合字詞的內部。可以使用 spell-COMPOUNDPERMITFLAG 來變更此行為。
spell-NEEDCOMPOUND
NEEDCOMPOUND 標記用於要求一個字詞必須作為複合字詞的一部分使用。該字詞本身不是正確的字詞。例如:
NEEDCOMPOUND &
spell-ONLYINCOMPOUND
ONLYINCOMPOUND 的作用與 NEEDCOMPOUND 完全相同。為了與 Hunspell 相容而支援。
spell-COMPOUNDMIN
使用 COMPOUNDMIN 指定用於複合的字詞的最小字元長度。例如:
COMPOUNDMIN 5
省略時沒有最小長度。顯然,您可以直接從短字詞中省略複合標記,此功能的存在是為了與 Myspell 相容。
spell-COMPOUNDWORDMAX
可以使用 COMPOUNDWORDMAX 指定可以串連成複合字詞的最大字詞數量。例如:
COMPOUNDWORDMAX 3
省略時沒有最大值。它適用於所有複合字詞。
要為具有特定標記的字詞設定限制,請確保它們在 COMPOUNDRULE 中出現的項目不允許有太多字詞。
spell-COMPOUNDSYLMAX
可以使用 COMPOUNDSYLMAX 指定複合字詞可能包含的最大音節數。例如:
COMPOUNDSYLMAX 6
如果沒有 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 .
字典
word/c
util/ac
這允許 "wordutil" 和 "wordutils",但不允許 "wordutilize"。注意:這尚不適用於延遲前綴。
spell-COMPOUNDPERMITFLAG
COMPOUNDPERMITFLAG 指定可以用在詞綴上的標記。這表示該字詞加上詞綴也可以在複合字詞中使用,其中詞綴最終出現在字詞的中間。如果沒有這個標記,則不允許這樣做。注意:這尚不適用於延遲前綴。
spell-COMPOUNDROOT
COMPOUNDROOT 標記用於字典中已經是複合字詞的字詞。這表示在檢查複合規則時,它會計為兩個字詞。也可以用於詞綴,將詞綴計為一個複合字詞。
spell-CHECKCOMPOUNDPATTERN
CHECKCOMPOUNDPATTERN 用於定義在兩個字詞複合在一起的位置匹配時,會禁止複合的模式。例如:
CHECKCOMPOUNDPATTERN o e
如果第一個字詞以 "o" 結尾,而第二個字詞以 "e" 開頭,則這會禁止複合。
參數必須是純文字,儘管項目名稱如此,但實際上不支援任何模式。大小寫始終被忽略。
不支援使用三個參數和標記的 Hunspell 功能。
spell-NOCOMPOUNDSUGS
此項目表示使用複合來提出建議並不是一個好主意。當複合與非常短或單一字元的字詞一起使用時,請使用此項目。例如,用數字構成數字。如果沒有此標記,建立建議會將大部分時間花費在嘗試各種奇怪的複合字詞上。
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」計算。
只需要包含經過大小寫摺疊的字母。
上面提到了另一種限制複合的方式:將 spell-COMPOUNDFORBIDFLAG 標記新增到詞綴會導致使用該詞綴所構成的所有字詞都不被用於複合。

無限制複合 spell-NOBREAK

對於某些語言(例如泰語),字詞之間沒有空格。這看起來就像所有字詞都已複合。要指定這一點,請在詞綴檔中使用 NOBREAK 項目,無需任何參數:
NOBREAK
Vim 會嘗試找出一個字詞的結尾和下一個字詞的開頭。當出現拼寫錯誤時,這可能不太正確。
spell-COMMON
可以使用 COMMON 項目指定常用字詞。這會在編輯短檔時提供更好的建議。例如:
COMMON the of to and a in is it you that he she was for on are
字詞必須以空格分隔,每行最多 25 個。如果在 ":mkspell" 命令中指定了多個區域,則會合併所有區域的常用字詞,並用於所有區域。
spell-NOSPLITSUGS
此項目表示拆分字詞以提出建議並不是一個好主意。只有在相似的字詞很少時,才會出現拆分字詞建議。
NOSPLITSUGS
spell-NOSUGGEST
使用 NOSUGGEST 指定的標記可以用於不會被建議的字詞。可以用於淫穢字詞。
NOSUGGEST %

替換 spell-REP

在詞綴檔中,REP 項目可以用於定義常見的錯誤。這用於提出拼寫建議。這些項目定義了「from」文字和「to」替換。例如:
REP 4
REP f ph
REP ph f
REP k ch
REP ch k
第一行指定了以下 REP 行的數量。Vim 會忽略此數字,但它必須存在(為了與 Myspell 相容)。
不要包含簡單的單一字元替換或交換。Vim 會自動嘗試這些。您可以包含整個字詞(如果需要),但您可能想要改為使用 'spellsuggest' 中的 "file:" 項目。
您可以透過使用底線來包含空格
REP the_the the

相似字元 spell-MAP E783

在詞綴檔中,可以使用 MAP 項目來定義非常相似的字母。這主要用於具有不同重音符號的字母。這用於優先選擇使用這些字母替換的建議。例如:
MAP 2
MAP eéëêè
MAP uüùúû
第一行指定了後續 MAP 行的數量。Vim 會忽略這個數字,但該行必須存在。
每個字母都必須只在一個 MAP 項目中出現。如果第一個字母是 ASCII 字元,或至少是一個沒有重音符號的字元,效率會稍微高一些。

.SUG 檔案 spell-NOSUGFILE

當在詞綴檔案中指定 soundfolding 時,":mkspell" 通常會在 .spl 檔案旁邊產生一個 .sug 檔案。此檔案用於快速尋找發音相似的建議。這會消耗大量記憶體(數量取決於單字的數量,當 ":mkspell" 完成時會顯示估計值)。
若要避免產生 .sug 檔案,請在詞綴檔案中使用此項目
NOSUGFILE
如果使用者不想使用 .sug 檔案,可以簡單地省略它。

SOUND-A-LIKE spell-SAL

在詞綴檔案中,SAL 項目可用於定義所使用的發音相似機制。主要項目定義「來源」文字和「目標」取代文字。簡單範例:
SAL CIA X
SAL CH X
SAL C K
SAL K K
有一些規則,而且可能會變得相當複雜。有關其工作原理的說明,請參閱 Aspell 手冊:http://aspell.net/man-html/Phonetic-Code.html
有一些特殊項目
SAL followup true
SAL collapse_result true
SAL remove_accents true
「1」與「true」具有相同的含義。任何其他值都表示「false」。

簡單的發音折疊 spell-SOFOFROM spell-SOFOTO

SAL 機制複雜且速度慢。一種更簡單的機制是將所有字元對應到另一個字元,將發音相似的字元對應到同一個字元。同時,這也會執行大小寫折疊。您不能同時擁有 SAL 項目和簡單的發音折疊。
需要兩個項目:一個用於指定對應的字元,另一個用於指定它們對應到的字元。它們必須具有完全相同的字元數。範例:
SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkes
在範例中,所有母音都被對應到同一個字元「e」。另一種方法是省略所有母音。有些發音幾乎相同且經常混淆的字元(例如「m」和「n」)會對應到同一個字元。不要過度使用此方法,所有單字都會開始看起來很像。
未出現在 SOFOFROM 中的字元將會被省略,但所有空白字元都會被一個空格取代。SOFOFROM 中相同的字元序列會被一個取代。
您可以使用 soundfold() 函數來嘗試結果。或者設定 'verbose' 選項,以查看 z= 命令輸出中的分數。

不支援的項目 spell-affix-not-supported

這些項目會出現在其他拼寫檢查器的詞綴檔案中。在 Vim 中,它們會被忽略、不支援或以其他方式定義。
ACCENT (Hunspell) spell-ACCENT
請改用 MAP。spell-MAP
BREAK (Hunspell) spell-BREAK
定義斷點。不清楚確切的工作方式。不支援。
CHECKCOMPOUNDCASE (Hunspell) spell-CHECKCOMPOUNDCASE
不允許在複合字邊界使用大寫字母。不支援。
CHECKCOMPOUNDDUP (Hunspell) spell-CHECKCOMPOUNDDUP
不允許在複合字中重複使用同一個單字兩次。不支援。
CHECKCOMPOUNDREP (Hunspell) spell-CHECKCOMPOUNDREP
關於使用 REP 項目和複合字。不支援。
CHECKCOMPOUNDTRIPLE (Hunspell) spell-CHECKCOMPOUNDTRIPLE
禁止在複合時出現三個相同的字元。不支援。
CHECKSHARPS (Hunspell) spell-CHECKSHARPS
大寫(德語)單字中的 SS 字母對可能為大寫 sharp s (ß)。不支援。
COMPLEXPREFIXES (Hunspell) spell-COMPLEXPREFIXES
啟用使用兩個字首。不支援。
COMPOUND (Hunspell) spell-COMPOUND
這是一行,包含 COMPOUND 項目的計數,後跟多行具有模式的 COMPOUND 行。移除包含計數的第一行,並將其他項目重新命名為 COMPOUNDRULE spell-COMPOUNDRULE
COMPOUNDFIRST (Hunspell) spell-COMPOUNDFIRST
請改用 COMPOUNDRULE。spell-COMPOUNDRULE
COMPOUNDBEGIN (Hunspell) spell-COMPOUNDBEGIN
使用 COMPOUNDBEGIN 標記的單字可以是複合字中的第一個元素。請改用 COMPOUNDRULE。spell-COMPOUNDRULE
COMPOUNDLAST (Hunspell) spell-COMPOUNDLAST
使用 COMPOUNDLAST 標記的單字可以是複合字中的最後一個元素。請改用 COMPOUNDRULE。spell-COMPOUNDRULE
COMPOUNDEND (Hunspell) spell-COMPOUNDEND
可能與 COMPOUNDLAST 相同
COMPOUNDMIDDLE (Hunspell) spell-COMPOUNDMIDDLE
使用 COMPOUNDMIDDLE 標記的單字可以是複合字中的中間元素。請改用 COMPOUNDRULE。spell-COMPOUNDRULE
COMPOUNDRULES (Hunspell) spell-COMPOUNDRULES
後續 COMPOUNDRULE 行的數量。會被忽略,但參數必須是數字。
COMPOUNDSYLLABLE (Hunspell) spell-COMPOUNDSYLLABLE
請改用 SYLLABLE 和 COMPOUNDSYLMAX。spell-SYLLABLE spell-COMPOUNDSYLMAX
KEY (Hunspell) spell-KEY
定義鍵盤上位置相近的字元。用於提供更好的建議。不支援。
LANG (Hunspell) spell-LANG
這指定了與語言相關的行為。這實際上將部分語言知識移入了程式中,因此 Vim 不支援它。每個語言屬性都必須單獨指定。
LEMMA_PRESENT (Hunspell) spell-LEMMA_PRESENT
僅用於形態分析。
MAXNGRAMSUGS (Hunspell) spell-MAXNGRAMSUGS
設定 n-gram 建議的數量。不支援。
PSEUDOROOT (Hunspell) spell-PSEUDOROOT
請改用 NEEDAFFIX。spell-NEEDAFFIX
SUGSWITHDOTS (Hunspell) spell-SUGSWITHDOTS
將點號添加到建議中。Vim 不需要此功能。
SYLLABLENUM (Hunspell) spell-SYLLABLENUM
不支援。
TRY (Myspell, Hunspell, 其他) spell-TRY
Vim 不使用 TRY 項目,它會被忽略。為了產生建議,會使用單字中的實際字元,這樣效率更高。
WORDCHARS (Hunspell) spell-WORDCHARS
用於辨識單字。Vim 不需要此功能,因為在檢查單字之前不需要分隔單字(使用 trie 而不是雜湊表)。

5. 拼寫檢查器設計 develop-spell

當要在 Vim 中加入拼寫檢查時,曾對可用的拼寫檢查函式庫和程式進行調查。不幸的是,結果發現它們都無法提供足夠的功能來作為 Vim 中的拼寫檢查引擎,原因有很多
缺少對多位元組編碼的支援。至少必須支援 UTF-8,以便在同一個檔案中使用多種語言。並非總是可以在執行時進行轉換(需要 iconv 支援)。
對於程式和函式庫:按原樣使用它們需要將它們與 Vim 分開安裝。這大多並非不可能,但這是一個缺點。
效能:一些測試表明,可以在執行時(重新繪製時)檢查拼寫,就像語法高亮顯示一樣。但其他程式碼使用的機制速度要慢得多。例如,Myspell 使用雜湊表。大多數拼寫檢查器使用的詞綴壓縮也會使其速度變慢。
對於使用像 aspell 這樣的外部程式,必須建立通訊機制。這很難以可攜式的方式完成(僅限 Unix 會比較簡單,但這不夠好)。而且效能會成為問題(涉及大量的程序切換)。
缺少對包含非單字字元的單字(例如「Etten-Leur」和「et al.」)的支援,需要將它們的片段標記為 OK,從而降低可靠性。
缺少對區域或方言的支援。這使得難以接受所有英文單字,並以不同的方式高亮顯示非加拿大單字。
缺少對罕見單字的支援。許多單字是正確的,但很少使用,並且可能是拼寫錯誤的常用單字。
對於產生建議,速度不那麼重要,而且需要安裝另一個程式或函式庫是可以接受的。但是單字清單可能會有所不同,建議可能是錯誤的單字。
提供建議有兩種基本機制:1. 嘗試稍微更改錯誤的單字,並檢查是否與正確的單字匹配。或者,瀏覽正確的單字列表,稍微更改它們,並檢查是否與錯誤的單字匹配。這些更改包括刪除一個字元、插入一個字元、交換兩個字元等等。2. 對錯誤的單字和正確的單字都執行語音折疊(soundfolding),然後尋找匹配項,可能像第一種機制一樣進行一些更改。
第一種方法適用於查找打字錯誤。在試驗了雜湊表並查看其他拼寫檢查器的解決方案後,結論是使用 Trie(一種樹狀結構)最為理想。無論是為了減少記憶體使用還是嘗試合理的更改,它都很適合。例如,當插入字元時,只需要嘗試那些會產生正確單字的字元。其他機制(使用雜湊表)需要在單字中的每個位置嘗試所有可能的字母。此外,雜湊表需要單獨識別單字邊界,而 Trie 不需要這樣做。這使得機制簡單得多。
當有人知道單字的發音但不知道如何拼寫時,語音折疊非常有用。例如,「dictionary」(字典)這個字可能會被寫成「daktonerie」。第一種方法需要嘗試的更改次數非常多,很難用這種方法找到正確的單字。經過語音折疊後,這些單字變成「tktnr」和「tkxnry」,它們僅相差兩個字母。
為了通過語音折疊後的等效形式(發音相似的單字)來查找單字,我們需要一份所有語音折疊後的單字列表。已經進行了一些實驗來找出最佳方法。替代方案:1. 在尋找建議時即時執行語音折疊。這意味著走遍正確單字的 Trie,對每個單字進行語音折疊,並檢查它與錯誤單字的差異程度。這種方法在記憶體使用方面非常有效,但需要很長時間。在快速 PC 上,英語需要幾秒鐘,這對於互動式使用是可以接受的。但對於某些語言,則需要超過十秒鐘(例如,德語、加泰隆尼亞語),這是無法接受的慢。對於批次處理(自動更正),它對於所有語言來說都太慢了。2. 對於語音折疊後的單字使用 Trie,這樣就可以像沒有語音折疊時那樣進行搜尋。這需要記住每個語音折疊後單字的一份正確單字列表。這使得查找匹配項非常快,但需要相當多的記憶體,大約在 1 到 10 MB 之間。對於某些語言,甚至比原始單字列表還多。3. 類似於第二種替代方案,但通過使用詞綴壓縮來減少記憶體使用,並且僅儲存語音折疊後的基礎單字。這就是 Aspell 所做的事情。缺點是在語音折疊錯誤單字之前,需要先從錯誤單字中剝離詞綴,這意味著在單字開頭和/或結尾的錯誤會導致該機制失效。此外,當錯誤單字與正確單字差異很大時,這種方法也會變慢。
最終選擇使用第二種機制並使用單獨的文件。這樣,記憶體充足的使用者可以獲得非常好的建議,而記憶體不足或只想進行拼寫檢查而不需要建議的使用者則不會使用那麼多記憶體。
單字頻率
為了對建議進行排序,了解哪些單字是常用的會有幫助。理論上,我們可以在字典中與單字一起儲存單字頻率。然而,這需要為每個單字儲存一個計數。這會大大降低單字樹壓縮的效率。而且維護所有語言的單字頻率將會是一項繁重的任務。此外,最好優先選擇文本中已有的單字。這樣,在特定文本中出現的單字會優先用於建議。
目前實現的方式是計算在顯示期間看到的單字。使用雜湊表可以快速找到單字計數。該計數從詞綴檔案中 COMMON 項目列出的單字初始化,這樣即使在啟動新檔案時也可以正常運作。
這並不是理想的做法,因為 Vim 執行的時間越長,計數就會變得越高。但在實務上,相較於不使用單字計數,這是一個顯著的改進。
主要
命令索引
快速參考