font-lock-keywords
の要素は、通常は複数行にわたるマッチを行うべきではありません。それらの動作に信頼性はありません。なぜならFont
Lockは通常はバッファーのごく一部をスキャンするので、そのスキャンが開始される行境界をまたがる複数行構造を見逃しかねないからです(スキャンは通常は行頭から開始される)。
ある要素にたいして複数行構造にたいするマッチを正しく機能させるために2つの観点があります。それは識別(identification)の補正と、再ハイライト(rehighlighting)の補正です。1つ目はFont Lockがすべての複数行構造を探すことを意味します。2つ目は複数行構造が変更されたとき、たとえば以前は複数行構造の一部だったテキストが複数行構造から除外されたときに、関連するすべてのテキストをFont Lockに正しく再ハイライトさせることを意味します。これら2つの観点は密接に関連しており、一方を機能させることがもう一方を機能させるようなことが多々あります。しかし信頼性のある結果を得るためには、これら2つの観点双方にたいして明示的に注意しなければなりません。
複数行構造の識別を確実に補正するには3つの方法があります:
font-lock-extend-region-functions
に追加する。
font-lock-fontify-region-function
フックを使用する。
font-lock-multiline
でそれをマークする。
複数行構造の再ハイライトを行うにはいくつかの方法があります:
font-lock-multiline
を配置する。これによりその構造の一部が変更されると構造全体が再ハイライトされるだろう。あるケースにおいてはそれを参照するfont-lock-multiline
変数をセットすることにより自動的にこれを行うことができる。
jit-lock-contextually
を確実にセットしてそれが行う処理に委ねる。これにより、実際の変更に続いて構造の一部だけが若干の遅延の後に再ハイライトされるだろう。これは複数行構造のさまざまな箇所のハイライトが後続行のテキストに依存しない場合のみ機能する。jit-lock-contextually
はデフォルトでアクティブなので、これは魅力的な解決策になり得る。
jit-lock-defer-multiline
を配置する。これはjit-lock-contextually
が使用された場合のみ機能し、再ハイライト前に同様の遅延を伴うが、font-lock-multiline
のように後続行に依存する箇所のハイライトも処理する。
syntax-multiline
を追加できる。これのもっとも一般的な用途は、‘FOO’に適用する構文プロパティ(syntax
property)が後出するテキスト‘BAR’に依存する場合である。このテキストプロパティを‘FOO...BAR’全体に配置することによって、‘BAR’にたいする任意の変更が‘FOO’の構文プロパティに影響を与えて再計算されることが保証される。これが機能するためには、モードがsyntax-propertize-extend-region-functions
にsyntax-propertize-multiline
を追加する必要があることに注意。