Nvim 的 :help
頁面,從 原始碼 使用 tree-sitter-vimdoc 解析器 產生。
:syntax clear這在最終的語法檔案中不是必需的,但在實驗時非常有用。
:syntax您可以使用它來檢查實際定義了哪些項目。當您正在實驗新的語法檔案時,這非常有用。它還顯示每個項目使用的顏色,這有助於找出每個項目是什麼。要列出特定語法群組中的項目,請使用
:syntax list {group-name}這也可以用來列出叢集(在 44.8 中說明)。只需在名稱中包含 @ 即可。
:syntax case match :syntax case ignore「match」參數表示 Vim 將匹配語法元素的大小寫。因此,「int」與「Int」和「INT」不同。如果使用「ignore」參數,則以下內容是等效的:「Procedure」、「PROCEDURE」和「procedure」。":syntax case" 指令可以出現在語法檔案中的任何位置,並影響隨後的語法定義。在大多數情況下,您的語法檔案中只有一個 ":syntax case" 指令;但是,如果您使用包含區分大小寫和不區分大小寫元素的非標準語言,則可以在整個檔案中散佈 ":syntax case" 指令。
:syntax keyword {group} {keyword} ...
{group}
是語法群組的名稱。您可以使用 ":highlight" 指令為 {group}
指派顏色。{keyword}
參數是實際的關鍵字。以下是一些範例:syntax keyword xType int long char :syntax keyword xStatement if then else endif此範例使用群組名稱「xType」和「xStatement」。按照慣例,每個群組名稱都以正在定義的語言的檔案類型作為前綴。此範例定義 x 語言(名稱不有趣的 eXample 語言)的語法。在「csh」指令碼的語法檔案中,將使用名稱「cshType」。因此,前綴等於 「filetype」 的值。這些指令會使單字「int」、「long」和「char」以一種方式高亮顯示,而單字「if」、「then」、「else」和「endif」則以另一種方式高亮顯示。現在您需要將 x 群組名稱連接到標準 Vim 名稱。您可以使用以下指令執行此操作
:highlight link xType Type :highlight link xStatement Statement這會告訴 Vim 將「xType」像「Type」一樣高亮顯示,並將「xStatement」像「Statement」一樣高亮顯示。請參閱 群組名稱 以了解標準名稱。
:setlocal iskeyword+=- :syntax keyword xStatement when-not":setlocal" 指令僅用於變更目前緩衝區的 「iskeyword」。它仍然會變更「w」和「*」等指令的行為。如果不需要這樣做,請不要定義關鍵字,而是使用匹配項(在下一節中說明)。
:syntax keyword xStatement n[ext]這不會比對到「nextone」,關鍵字永遠只比對整個單字。
:syntax match xIdentifier /\<\l\+\>/
:syntax match xComment /#.*/由於您可以使用任何搜尋模式,因此您可以使用匹配項目來高亮顯示非常複雜的事物。請參閱 pattern 以取得搜尋模式的相關說明。
:syntax region xString start=/"/ end=/"/「start」和「end」指令定義用於尋找區域開頭和結尾的模式。但是,如果字串看起來像這樣呢?
:syntax region xString start=/"/ skip=/\\"/ end=/"/雙反斜線會比對單個反斜線,因為反斜線是搜尋模式中的特殊字元。
:syntax keyword xTodo TODO contained :syntax match xComment /%.*/ contains=xTodo在第一行中,「contained」參數告訴 Vim 這個關鍵字只能存在於另一個語法項目內。下一行具有「contains=xTodo」。這表示 xTodo 語法元素位於其中。結果是整行註解會與「xComment」比對,並變為藍色。其中的單字 TODO 會與 xTodo 比對,並高亮顯示為黃色(已為 xTodo 設定高亮顯示)。
:syntax region xBlock start=/{/ end=/}/ contains=xBlock假設您有這個文字
:syntax region xComment start=/%/ end=/$/ contained :syntax region xPreProc start=/#/ end=/$/ contains=xComment您將註解定義為從 % 到行尾的任何內容。前置處理器指令是從 # 到行尾的任何內容。由於您可以在前置處理器行上加上註解,因此前置處理器定義包含「contains=xComment」參數。現在看看此文字會發生什麼事
:syntax region xComment start=/%/ end=/$/ contained :syntax region xPreProc start=/#/ end=/$/ contains=xComment keepend
:syntax region xList start=/\[/ end=/\]/ contains=ALL所有語法項目都將包含在此項目中。它也包含自身,但不在同一位置(這會導致無止盡的迴圈)。您可以指定不包含某些群組。因此,包含所有群組,但列出的群組除外
:syntax region xList start=/\[/ end=/\]/ contains=ALLBUT,xString使用「TOP」項目,您可以包含所有沒有「contained」引數的項目。「CONTAINED」用於僅包含具有「contained」引數的項目。詳情請參閱 :syn-contains。
:syntax match xIf /if/ nextgroup=xIfCondition skipwhite :syntax match xIfCondition /([^)]*)/ contained nextgroup=xThen skipwhite :syntax match xThen /then/ contained「nextgroup」引數指定下一個可以出現的項目。這不是必需的。如果沒有找到指定的項目,則不會發生任何事。例如,在此文字中
:syntax region xInside start=/(/ end=/)/假設您想要以不同的方式突出顯示括號。您可以使用許多複雜的區域語句來做到這一點,或者您可以使用「matchgroup」引數。這會告訴 Vim 使用不同的突出顯示群組(在此例中為 xParen 群組)來突出顯示區域的開始和結束
:syntax region xInside matchgroup=xParen start=/(/ end=/)/「matchgroup」引數會套用到它之後的開始或結束匹配。在先前的範例中,開始和結束都使用 xParen 突出顯示。要使用 xParenEnd 突出顯示結束
:syntax region xInside matchgroup=xParen start=/(/ \ matchgroup=xParenEnd end=/)/使用「matchgroup」的一個副作用是,包含的項目不會在區域的開始或結束處匹配。「transparent」的範例使用了這一點。
:syntax region cWhile matchgroup=cWhile start=/while\s*(/ end=/)/ \ contains=cCondNest :syntax region cFor matchgroup=cFor start=/for\s*(/ end=/)/ \ contains=cCondNest :syntax region cCondNest start=/(/ end=/)/ contained transparent現在您可以為 cWhile 和 cFor 提供不同的突出顯示。cCondNest 項目可以出現在其中任何一個中,但會接管它所包含項目的突出顯示。「transparent」引數會導致此情況發生。請注意,「matchgroup」引數具有與項目本身相同的群組。那為什麼還要定義它?好吧,使用 matchgroup 的副作用是,包含的項目不會在與開始項目匹配時被找到。這避免了 cCondNest 群組匹配「while」或「for」之後的 (。如果發生這種情況,它將跨越整個文字直到匹配的 ),並且該區域會在它之後繼續。現在 cCondNest 只會在與開始模式匹配之後,也就是第一個 ( 之後匹配。
:syntax region xCond start=/if\s*(/ms=e+1 end=/)/me=s-1開始模式的偏移為「ms=e+1」。「ms」代表「Match Start」。這會定義匹配開始的偏移。通常,匹配從模式匹配的位置開始。「e+1」表示匹配現在從模式匹配的結尾開始,然後再往後一個字元。結束模式的偏移為「me=s-1」。「me」代表「Match End」。「s-1」表示模式匹配的開始,然後往前一個字元。結果是在此文字中
:syntax region xIfThen start=/if/ end=/then/ oneline這會定義一個從「if」開始,到「then」結束的區域。但是,如果「if」之後沒有「then」,則該區域不會匹配。
:syntax region xPreProc start=/^#/ end=/$/ contains=xLineContinue :syntax match xLineContinue "\\$" contained在這種情況下,儘管 xPreProc 通常匹配單行,但其中包含的群組(即 xLineContinue)可讓它持續超過一行。例如,它會匹配這兩行
:syntax region xPreProc start=/^#/ end=/$/ \ contains=xLineContinue,xPreProcEnd :syntax match xPreProcEnd excludenl /end$/ contained :syntax match xLineContinue "\\$" contained「excludenl」必須放在模式之前。由於「xLineContinue」沒有「excludenl」,因此與它的匹配會像之前一樣將 xPreProc 延伸到下一行。
:syntax match xFor /^for.*/ contains=xNumber,xIdent :syntax match xIf /^if.*/ contains=xNumber,xIdent :syntax match xWhile /^while.*/ contains=xNumber,xIdent您必須每次都重複相同的「contains=」。如果您想要新增另一個包含的項目,則必須新增三次。語法叢集透過讓一個叢集代表數個語法群組來簡化這些定義。要為這三個群組包含的兩個項目定義一個叢集,請使用以下命令
:syntax cluster xState contains=xNumber,xIdent叢集在其他語法項目中使用的就像任何語法群組一樣。它們的名稱以 @ 開頭。因此,您可以像這樣定義這三個群組
:syntax match xFor /^for.*/ contains=@xState :syntax match xIf /^if.*/ contains=@xState :syntax match xWhile /^while.*/ contains=@xState您可以使用「add」引數將新的群組名稱新增到此叢集
:syntax cluster xState add=xString您也可以從此清單中移除語法群組
:syntax cluster xState remove=xNumber
:runtime! syntax/c.vim「:runtime!」命令會搜尋 'runtimepath' 中的所有「syntax/c.vim」檔案。這會使 C++ 語法的 C 部分定義為與 C 檔案相同。如果您已取代 c.vim 語法檔案,或使用額外檔案新增項目,這些也會被載入。載入 C 語法項目之後,可以定義特定的 C++ 項目。例如,新增 C 中未使用的關鍵字
:syntax keyword cppStatement new delete this friend using它的運作方式就像任何其他語法檔案一樣。
:syntax include @Pod <sfile>:p:h/pod.vim :syntax region perlPOD start=/^=head/ end=/^=cut/ contains=@Pod當在 Perl 檔案中找到「=head」時,perlPOD 區域會開始。在此區域中,包含 @Pod 叢集。在 pod.vim 語法檔案中定義為頂層項目的所有項目都將在此處匹配。當找到「=cut」時,該區域結束,我們返回到 Perl 檔案中定義的項目。「:syntax include」命令非常聰明,可以忽略包含檔案中的「:syntax clear」命令。而且,「contains=ALL」之類的引數只會包含在包含檔案中定義的項目,而不是在包含它的檔案中定義的項目。「<sfile>:p:h/」部分使用目前檔案的名稱 (
<sfile>
),將其展開為完整路徑 (:p),然後取得標頭 (:h)。這會產生檔案的目錄名稱。這會導致包含相同目錄中的 pod.vim 檔案。:syntax sync ccomment您可以使用一些引數來調整此處理。「minlines」引數會告訴 Vim 要向後尋找的最小行數,「maxlines」會告訴編輯器要掃描的最大行數。例如,以下命令會告訴 Vim 在畫面頂端之前至少查看 10 行
:syntax sync ccomment minlines=10 maxlines=500如果它無法在那空間中找出它的位置,它會開始向後搜尋得更遠,直到它找出該怎麼做。但它不會向後搜尋超過 500 行。(較大的「maxlines」會減慢處理速度。較小的「maxlines」可能會導致同步失敗。)為了使同步速度更快,請告訴 Vim 可以跳過哪些語法項目。只有在實際顯示文字時才需要使用的每個匹配和區域都可以賦予「display」引數。根據預設,找到的註解會著色為 Comment 語法群組的一部分。如果您想要以其他方式著色,您可以指定不同的語法群組
:syntax sync ccomment xAltComment如果您的程式語言中沒有 C 樣式的註解,您可以嘗試另一種同步方法。最簡單的方法是告訴 Vim 向後間隔一定行數,並嘗試從那裡找出問題。以下命令會告訴 Vim 返回 150 行,並從那裡開始剖析
:syntax sync minlines=150較大的「minlines」值可能會使 Vim 變慢,尤其是在檔案中向後捲動時。最後,您可以使用以下命令指定要尋找的語法群組
:syntax sync match {sync-group-name} \ grouphere {group-name} {pattern}這會告訴 Vim,當它看到
{pattern}
時,名為 {group-name}
的語法群組會在給定模式之後立即開始。{sync-group-name}
用於為此同步規格命名。例如,sh 指令碼語言以「if」開頭 if 語句,以「fi」結尾:syntax sync match shIfSync grouphere shIf "\<if\>"「groupthere」引數會告訴 Vim,模式會結束一個群組。例如,if/fi 群組的結尾如下
:syntax sync match shIfSync groupthere NONE "\<fi\>"在此範例中,NONE 會告訴 Vim 您不在任何特殊的語法區域中。特別是,您不在 if 區塊內。
:syntax sync match xSpecial /{.*}/關於同步的更多資訊請參考手冊::syn-sync。
:syntax keyword cType off_t uint請撰寫與原始語法檔名稱相同的檔案。在此例中為 "c.vim"。將它放置在 'runtimepath' 接近尾端的目錄中。這會使其在原始語法檔之後載入。在 Unix 系統上,這會是
" Vim syntax file " Language: C " Maintainer: Bram Moolenaar <[email protected]> " Last Change: 2001 Jun 18 " Remark: Included by the C++ syntax.使用與其他語法檔相同的佈局。使用現有的語法檔作為範例可以節省您大量的時間。
if exists("b:current_syntax") finish endif在檔案末尾將 "b:current_syntax" 設定為語法的名稱。別忘了包含的檔案也會這樣做,如果您包含兩個檔案,您可能需要重設 "b:current_syntax"。
hi def link nameString String hi def link nameNumber Number hi def link nameCommand Statement ... etc ...將 "display" 參數新增到同步時不使用的項目,以加快向後滾動和
CTRL-L
的速度。