0

vim の JavaScript 文字列の HTML 構文の強調表示から JavaScript 文字列に HTML 構文を埋め込む方法を見てきました。

しかし、CoffeeScript を使用するとcoffee.vim、同様の方法で構文ファイルを編集しても同じことが機能しません。html.vimネストしすぎていることを含む再帰エラーが発生しました。

次のようなCoffeeScriptのHTMLテンプレートがあります::

angular.module('m', [])
  .directive(
    'myDirective'
    [
      ->
        template: """
        <div>
          <div>This is <b>bold</b> text</div>
          <div><i>This should be italic.</i></div>
        </div>
        """
    ]
  )

VIM で適切に強調表示された CoffeeScript 文字列のテンプレート HTML 構文を取得するにはどうすればよいですか?

4

2 に答える 2

0

これを機能させようとしている間、私はさまざまな問題にも遭遇していました。いくつかの実験の後、ここに私が思いついたものがあります。.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 ファイルはかなり単純である可能性が高いため、これは妥当なトレードオフのように思えます。

于 2013-02-25T01:57:55.897 に答える