ヒアドキュメント内で言語固有の構文を有効にするにはどうすればよいですか?


19

PHPファイルを編集して、heredocで文字列を定義すると、JavaScript構文、HTML構文、またはSQL構文の場合、heredoc内で構文の強調表示が有効になります。ただし、CSS構文では機能しません。

例(hello.php次のコードで呼び出される新しいPHPファイルを作成する場合):

<?php
$foo = <<<"JAVASCRIPT"
var hello = "hello";
JAVASCRIPT;

$bar = <<<"CSS"
/* This code below should be syntax-highlighted. */
.hello {
  font-weight: bold;
}
CSS;

JAVASCRIPTブロックが正しく強調表示されますが、CSSブロックではありません。また、JavaScriptコードブロックのキーワードで実行SynStackするvarとが取得さ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier']れますが、CSSブロック内の任意の場所で同じ操作を実行するとのみが取得されるため['phpRegion', 'phpHereDoc']、CSS構文の強調表示ルールを追加する必要があります。これらの構文規則はどこで定義され、どのように追加しますか?


1
注:// This should be syntax-highlightedは有効なCSSコメントではないため、コメント以外の構文として強調表示する必要があります。CSSは/* */複数行コメントのみをサポートします。//単一行コメントは、SassやStylusなどのプリプロセッサ言語を使用する場合にのみサポートされます。
ロリーO'Kane

あなたは正しいです。その変更を反映するようにコードを更新しました。
MrSnrub

私もCSS heredoc構文ハイライトの解決策を探しています。私は多くのシナリオを試しましたが、動作させることができませんでした。誰にも解決策がありますか?
ケン

回答:


3

TL; DR:

VimのPHPおよびHTML構文ファイルで定義されています。CSSのルールを追加する方法を確認するには、セクションにジャンプし、どのように追加しますか?以下、またはその仕組みの説明をお読みください。

これらの構文規則はどこで定義されていますか?

JavaScriptヒアドキュメントは、Vimの構文contains1機能を使用して強調表示されます。これにより、構文グループに他の構文グループを含めることができます。

これが定義されている場所を見つけるには、まず、PHPの構文強調表示ファイルを開きます。

:e $VIMRUNTIME/syntax/php.vim

さて、おそらくシンタックスファイルは文字列「javascript」の一致に基づいてJavaScriptヒアドキュメントを見つけているので、それを検索してみましょう。

/javascript

3番目の一致は次のコメントです。

" including HTML,JavaScript,SQL even if not enabled via options

有望に見えます!関連する構文行を見てみましょう。

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

読みやすくするために行の継続が追加されました

さて、この構文領域は、複雑な正規表現を持つJavaScriptヒアドキュメントを見つけ、引数内に@htmlJavascript構文cluster2を含めることで領域内でJavaScriptを強調表示できるようにしcontainsます。

しかし、CSS heredocsに対応する定義はありません!追加してみましょう。したがって、最初に変更するのはstart正規表現です。単純に変更javascriptcss

start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"

これは簡単!

しかし、CSSヒアドキュメントではJavaScriptの強調表示は必要ありません。その@htmlJavascriptため、同等のCSS に変更する必要もあります。しかし、同等のCSS 何ですか?(推測できるかもしれませんが、動作を確認してみましょう。)

htmljavascript3を検索して、それが定義されている場所を確認します。

/htmljavascript

うーん。他の結果はありません。別の場所で定義する必要があります!インクルードを見つけることができるかどうかを確認するために、ファイルの上部を簡単に見てみましょう。

runtime! syntax/html.vim

これは4のように見えます。

:e $VIMRUNTIME/syntax/html.vim

このファイルで検索を再度実行すると、次の行5が見つかります。

syn cluster htmlJavaScript      add=@htmlPreproc

htmlJavaScriptはでcluster定義されていhtml.vimます。CSSに使用できる同様のクラスターはありますか?

/htmlcss

うん!

syn include @htmlCss syntax/css.vim

だから我々は単に交換する必要がある@htmlJavascript@htmlCsscontains引数:

contains=@htmlCss,phpIdentifierSimply,phpIdentifier,[...]

そして、それらにどのように追加しますか?

以下の構文コマンド全体をファイルに保存して~/after/syntax/php.vim、残りのPHP構文処理が実行された後に実行されるようにし、完了です!

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlCss,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

1:詳細:help :syn-containsを参照してください。
2:を参照してください:help :syn-cluster
3:'ignorecase'電源を入れました。それがなければ、あなたはを検索する必要がありますhtmlJavascriptまたは\chtmljavascript
4:実際には、Vimの構文ファイルで使用される命名体系に基づいて、我々は、おそらくに基づいてこれを考え出している可能性がhtmlJavascript名前だけ。
5:今回は「JavaScript」の大文字と小文字が異なります。ラッキー'ignorecase'、スイッチを入れたよね?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.