VIM構文の強調表示:完全な没入感

VIMは、構成が簡単かつ柔軟であることで有名です。 この記事では、さまざまな例を使用して独自の構文強調ルールを作成することがいかに簡単で単純かを詳しく説明します。



はい、 Habrにはすでにそれに関する記事がありましたが、そのトピックは非常に表面的に考えられていたので、詳細に理解しようとします。 habraマークアップタグを強調表示するためのhtml強調表示拡張機能を含む最も単純な例から、「コンテキスト依存」構文強調表示を使用した本格的なプログラミング言語の強調表示の作成まで検討します。



特に便利なのは、ファイルの編集中に追加の動きをせずにバックライトを操作して、すぐに結果を観察できることです。 だから、誰もがVIMを開き、私の記事の例を試してみることをお勧めします。



キーワードの強調表示



まず、簡単な例を考えてみましょう。テキストを編集し、自分で「todo-読みやすいようにこの文を書き直してください」のようにメモを残します。 テキストの読みを単純化し、「todo」という単語を強調表示しましょう。 これを行うには、コマンドモードで次のように入力します。

:syn keyword Keyword todo
      
      





出来上がり! 今、私たちはエディターで次のように見える:







最初のキーワードパラメータを指定したsyn(構文)コマンドは、キーワードスタイルでtodoという単語を強調表示します。 このスタイルの色は、配色によって異なります。 一度に多くのキーワードをリストできます。



 :syn keyword Keyword todo rewrite done
      
      







正規表現の強調表示



次のコマンドは、wimの正規表現を強調表示するために使用されます。

 :syn match AnyHighlightStyle /herer-is-regexp/
      
      





覚えておくべき主なことは、Wimの正規表現の構文は、Perlのような正規表現(多くが慣れている)とは大きく異なるということです。

Perlのような Vim
oneOrMany + oneOrMany \ +
(グループ) \(グループ\)
(オプション) \(オプションの\)\ =
(notSoManyTimes){2、4} \(notSoManyTimes \)\ {2、4}
何か(?= lookAhead) 何か\(lookAhead \)\ @ =
何か(?!shouldNotBeThere) 何か\(shouldNotBeThere \)\ @!
(?<= lookBackward)何か \(lookBackword \)\ @ <= ssomething




最初の例として、数字の強調表示を検討します。



 :syn match Float /\d\+\(\.\d\)\=/
      
      









ここで、より複雑な例を見てみましょう-関数呼び出しを強調しましょう。 関数呼び出しは、次のように定義されます:識別子の後に開き括弧が続きます(ただし、括弧自体を強調表示する必要はありません。これを行うには、先読み構造\ zeを使用します。関数の色で強調表示されません):



 :syn match Function /\w\+\((\)\@=/
      
      









または、コンストラクター呼び出しを強調してみましょう:new SomeClassName。 これを行うには、\ zeに似た構造を使用し、「後方」のみをスキャンします。\ zs



 :syn match Function /\(new\s\+\)\@<=\w\+/
      
      







ハイライト領域



たとえば、コメント、行、htmlのタグなど、特定の開閉構造を持つブロックの強調表示を簡素化するために、強調表示領域が存在します。 領域を設定するための構文は次のとおりです。

 :syn region SomeHighlightStyle start=/start-regexp/ end=/end-regexp/ skip=/regexp-to-skip-and-not-treat-as-an-end-regexp/
      
      







リーマーでの使用を検討してください。 まず、Cスタイルの複数行コメントを強調表示します。



 :syn region Comment start=/\/\*/ end=/\*\//
      
      





次に、もう少し複雑な例を見てみましょう。二重引用符で囲まれた行を強調表示しましょう。



 :syn region String start=/"/ end=/"/
      
      





ただし、このような構造には欠陥があります。文字自体を文字列に含めることはできません。この欠陥を修正し、エスケープされた引用符を文字列の終わりと見なさないようにしましょう。領域の終わりでチェックする:



 :syn region String start=/"/ skip=/\\"/ end=/"/
      
      









これで正常に機能するようになりました。



領域の「折りたたみ」(折りたたみ)



Vimでは、ブロック(たとえば、長いコメントやコードブロック)を「折りたたむ」ことができます。 これを行うために、コマンド:synにはオプションのfoldパラメーターがあります。 したがって、ユーザーにコメントを折りたたむには、synコマンドの最後にfoldを追加するだけです。



 :syn region Comment start=/\/\*/ end=/\*\// fold
      
      





構文強調表示からの情報が「折りたたみ」に使用されることを確認する必要があります。



 set foldmethod=syntax
      
      





コード内の{}括弧の内容の折りたたみを記述するために、コードを内側に強調表示したままにする(デフォルトでは「食べる」:syn領域)には、syn region:で透過パラメーターを使用できます。



 :syn region CodeBlock start=/{/ end=/}/ transparent fold
      
      





この場合、コマンドは{}内のブロックの外観を変更しませんが、折りたたむことができます。



ハイライトスタイル



コマンドの2番目の引数:syn-マークアップするスタイルは任意の行にできます。 また、「構造」と「プレゼンテーション」を分けるために、次のように良い意味で、synは「構造名」と言語プレフィックスを示します。次に例を示します。



 :syn keyword pascalKeyword begin end var procedure function :syn keyword pascalBuiltinFunction WriteLn ReadLn Assign
      
      





そして、hi(hilight)コマンドを使用して、これらのスタイルをVIMカラースキームで説明されているスタイルと比較します。



 :hi link pascalKeyword Keyword :hi link pascalBuiltinFunction Keyword
      
      







ネストされたブロック



では、次の例を見てみましょう。コメントでキーワードを強調したい:TODO、NOTE、これは多くの場合プログラマーが残しています。 これを行うために、VIMには2つのパラメーターが含まれており、構文に含まれています:syn。 「含む」は、強調表示ルールが「グローバル」領域に適用されないことを意味します。 また、= Style1を含むStyle2は、ルール内でStyle1とStyle2のスタイルを記述するルールを探す価値があることを意味します。 それがどのように見えるか見てみましょう:



 :syn keyword CommentKeyword TODO NOTE contained :syn region Comment start=/\/\*/ end=/\*\// contains CommentKeyword :hi link CommentKeyword Keyword
      
      





したがって、TODOおよびNOTE以外のコメントは強調表示されず、コメント内でのみ強調表示されます。



キーワードだけでなく、強調表示ルールも「含める」ことができます。 たとえば、文字列内のエスケープ可能な文字を選択できます。\ n、\ t、\ r、\ b:



 :syn region String start=/"/ skip=/\\"/ end=/"/ contains=EscapeSymbol :syn match EscapeSymbol /\\[ntrb"]/ contained :highlight link EscapeSymbol Keyword
      
      









実用例:.htmlファイルでのHabrategの強調表示



.htmlファイルのVIMでhabrapostを記述した場合、残念ながらhabracut、hhなどのハブ固有のタグは強調表示されません。 この誤解を修正してください。 これを行うには、html:.vim / syntax / html.vim強調表示ファイルに移動し、タグ名強調表示スタイルがhtmlTagNameと呼ばれることを確認します。コマンドを入力してください:



 :syn keyword htmlTagName habracut source hh video slideshow
      
      









拡張子別のバックライト



もちろん、コマンドを入力してすべてのデザインを強調表示します。もちろん、誰も必要としません。 すべてのコマンドは、ファイルで発行する必要があります(たとえば)ディレクトリ内のmy.vim(必須).vim / syntax /これで、私のスクリプトのようなファイルに対して、このスクリプトが自動的に適用されます。 そして、拡張子に応じてタイプが自動的に付加されるように、次の行を.vimrcに追加する必要があります。



 au BufRead,BufNewFile *.my set filetype=my
      
      





BufReadとBufNewFileは、開いている既存のファイルと作成された新しいファイルの両方にルールを適用することを意味します。



ところで、突然このコマンドを知らなかった場合は、非標準の拡張子を持つファイルを自動的に強調表示するために使用することもできます。たとえば、データベースダンプを.dumpファイルに保存してから、



 au BufRead,BufNewFile *.dump set filetype=sql
      
      





自動的に開くと、SQLファイルとして色付けされます。



全体の例



それでは、簡単な例を全体として見てみましょう。javascript言語のサブセットを色付けしましょう。



 " javascript       ,   if exists("b:current_syntax") finish endif " javascript       ,       syn region jsString start=/"/ skip=/\\"/ end=/"/ contains=jsEscapeSymbol,jsDoubleQuoteEscape syn region jsString start=/'/ skip=/\\'/ end=/'/ contains=jsEscapeSymbol,jsSingleQuoteEscape syn match jsEscapeSymbol /\\[ntrb]/ contained syn match jsSingleQuoteEscape /\\'/ contained syn match jsDoubleQuoteEscape /\\"/ contained syn match jsFunction /\w\+\((\)\@=/ syn match jsFunction /\(new\s\+\)\@<=\w\+/ "  /* * syn region jsComment start=/\/\*/ end=/\*\// "  // syn region jsComment start=/\/\// end=/$/ syn keyword jsKeyword if else while new for throw catch function hi link jsKeyword Keyword hi link jsString String hi link jsEscapeSymbol jsEscape hi link jsDoubleQuoteEscape jsEscape hi link jsSingleQuoteEscape jsEscape hi link jsEscape Keyword hi link jsComment Comment hi link jsFunction Function ",     javascript   let b:current_syntax="javascript"
      
      







さて、最後に





強調表示する言語が大文字と小文字を区別しない場合-コマンドを使用します
 syn case ignore
      
      



バックライトの説明の冒頭に。



バックライトを編集するとき、結果を常に見たいです。 これを行うには、別のバッファーで色付けテキストを開き、結果を更新する場合は、eまたは:syn off | syn onと入力します。



UPD:記事のエラーに関する多くのコメントをしてくれたGoderに感謝します:)



All Articles