通常、font-lock-keywords
の要素が複数行にわたってマッチすることはありません。Font Lock
は通常バッファの一部のみをスキャンするため、スキャン開始位置が行境界をまたぐような複数行の構造を見逃す可能性があり、この方法では確実に動作しません。(通常、スキャンは行の先頭から開始されます。)
複数行構成要素に対応する要素を適切に動作させるには、正しい識別と正しい再ハイライトという2つの側面があります。前者は、Font Lockがすべての複数行構成要素を検出することを意味します。後者は、複数行構成要素が変更された際――例えば、以前は複数行構成要素の一部であったテキストの一部がその一部ではなくなった場合など――に、Font Lockが関連するすべてのテキストを正しく再ハイライトすることを意味します。これら2つの側面は密接に関連しており、一方を機能させればもう一方も機能するように見えることがよくあります。しかし、確実な結果を得るには、両方の側面に明示的に取り組む必要があります。
複数行構成要素を正しく識別するための方法は、次の3通りあります。
font-lock-extend-region-functions に、識別を行い、スキャン対象のテキストが複数行構成の途中で開始または終了しないようにスキャン範囲を拡張する関数を追加してください。
font-lock-fontify-region-function
フックを使用してスキャン範囲を拡張し、スキャン対象のテキストが複数行構成の途中で開始または終了しないようにしてください。
font-lock-multiline でマークします。これにより、font-lock
に対して当該構成の途中でスキャンを開始または終了しないよう指示します。
複数行の構文を再ハイライトするには、いくつかの方法があります:
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’に適用する構文プロパティが、後続のテキスト‘BAR’に依存している場合です。‘FOO...BAR’全体にこのテキストプロパティを配置することで、‘BAR’に変更があった場合に、‘FOO’の構文プロパティも再計算されるようになります。注:これが機能するためには、モードがsyntax-propertize-multilineをsyntax-propertize-extend-region-functionsに追加する必要があります。