これを機能させようとしている間、私はさまざまな問題にも遭遇していました。いくつかの実験の後、ここに私が思いついたものがあります。.vim/after/syntax/coffee.vim
以下の内容で作成するだけです。
unlet b:current_syntax
syntax include @HTML $VIMRUNTIME/syntax/html.vim
syntax region coffeeHtmlString matchgroup=coffeeHeredoc
\ start=+'''\\(\\_\\s*<\\w\\)\\@=+ end=+\\(\\w>\\_\\s*\\)\\@<='''+
\ contains=@HTML
syn sync minlines=300
このunlet b:current_syntax
行は、現在の構文一致を無効にし、HTML 構文定義が一致する領域を引き継ぐようにします。
html.vim インクルードに絶対パスを使用すると、再帰の問題を回避できます (詳細は後述)。
リージョン定義は、HTML を含むように見えるヒアドキュメント文字列と一致します。具体的には、開始パターンは 3 つの一重引用符の後に HTML タグの開始のように見えるもの (2 つの間に空白を入れることができます) を探し、終了パターンは HTML タグの末尾とそれに続く 3 つの一重引用符を探します。HTML が含まれていないように見えるヒアドキュメント文字列は、coffeeHeredoc
パターンを使用して一致します。coffeeHeredoc
これは、この構文ファイルが coffeescript プラグインからの構文定義の後に読み込まれるため、より一般的な一致 (領域) が発生する前に、より具体的な一致 (HTML を含むヒアドキュメント) を作成する機会を得るためです。
はsyn sync minlines=300
マッチング領域を広げます。埋め込まれた HTML 文字列が 50 行を超えることもあり、Vim の構文ハイライターが文字列をどのように強調表示するかについて混乱していました。完全に確実に使用できますsyn sync fromstart
が、大きなファイルの場合、理論的には遅くなる可能性があります(私は試していません)。
@heartbreaker が最初に経験した再帰の問題は、vim-coffeescript
プラグインに付属の html.vim スクリプトが原因でした (使用されていたと思います)。そのプラグインの html.vim ファイルには、coffeescript の強調表示を HTML ファイルに追加するためのその coffee.vim 構文ファイルが含まれています。相対構文インクルードの使用
syntax include @HTML syntax/html.vim
VIM のランタイム パスにあるすべての syntax/html.vim ファイルを取得します。これには、coffeescript プラグイン (coffee.vim を含むため、再帰が含まれます) からのものも含まれます。絶対パスを使用すると、指定した特定の構文ファイルのみを取得するように制限されますが、coffeescript 文字列に埋め込む HTML ファイルはかなり単純である可能性が高いため、これは妥当なトレードオフのように思えます。