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` コマンドが1つだけです。ただし、大文字と小文字を区別する要素と区別しない要素の両方を含む特殊な言語を扱う場合は、ファイル全体に `: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言語(面白みのない名前の例示言語)の構文を定義しています。「csh」スクリプトの構文ファイルでは、「cshType」という名前が使用されます。したがって、プレフィックスは 'filetype' の値と同じになります。これらのコマンドにより、「int」、「long」、「char」という単語は1つの方法でハイライトされ、「if」、「then」、「else」、「endif」という単語は別の方法でハイライトされます。これで、xグループ名を標準的なVim名に接続する必要があります。次のコマンドでこれを行います。
:highlight link xType Type :highlight link xStatement Statementこれにより、Vim は「xType」を「Type」のように、「xStatement」を「Statement」のようにハイライトします。標準的な名前については、group-name を参照してください。
: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すべての構文アイテムがこの1つに含まれます。それ自体も含まれていますが、同じ位置ではありません(無限ループを引き起こす可能性があります)。一部のグループを含めないように指定できます。したがって、リストされているものを除くすべてのグループを含みます。
: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」引数は、次にどの項目が来ることができるかを指定します。これは必須ではありません。指定された項目が1つも見つからない場合、何も起こりません。例えば、このテキストでは
: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」引数が項目自体と同じグループであることに注意してください。では、なぜこれを定義するのでしょうか?それは、マッチグループを使用する副作用として、含まれる項目が先頭項目とのマッチでは見つからないためです。これにより、cCondNestグループが「while」または「for」の直後の(にマッチすることがなくなります。これが発生すると、対応する)まで全体のテキストにまたがり、領域はその後に続きます。これで、cCondNestは先頭パターンとのマッチの後、つまり最初の(の後にのみマッチします。
:syntax region xCond start=/if\s*(/ms=e+1 end=/)/me=s-1先頭パターンのオフセットは「ms=e+1」です。「ms」はマッチ開始を表します。これはマッチ開始位置のオフセットを定義します。通常、マッチはパターンがマッチした場所で開始されます。「e+1」は、マッチがパターンマッチの末尾から1文字先に開始されることを意味します。末尾パターンのオフセットは「me=s-1」です。「me」はマッチ終了を表します。「s-1」はパターンマッチの開始位置から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は通常1行にマッチしますが、それに含まれるグループ(つまりxLineContinue)により、複数行にわたることができます。例えば、次の2行の両方にマッチします。
: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=」を繰り返す必要があります。別の包含項目を追加する場合は、3回追加する必要があります。構文クラスタは、1つのクラスタが複数の構文グループを表すことができるようにすることで、これらの定義を簡素化します。3つのグループが含む2つの項目のクラスタを定義するには、次のコマンドを使用します。
:syntax cluster xState contains=xNumber,xIdentクラスタは、他の構文項目と同様に、他の構文項目内で使用されます。その名前は@で始まります。したがって、3つのグループは次のように定義できます。
: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=@PodPerlファイルで「=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"を構文の名前に設定します。インクルードされたファイルもこれを行うことを忘れないでください。2つのファイルをインクルードする場合は、"b:current_syntax"をリセットする必要があるかもしれません。
hi def link nameString String hi def link nameNumber Number hi def link nameCommand Statement ... etc ...同期に使用されない項目に「display」引数を追加して、後方スクロールと`CTRL-L`の速度を上げます。