複数行にわたるFont Lock構文を確実に再ハイライトさせる一つの方法は、それらにテキストプロパティ font-lock-multiline
を付与することです。複数行構文の一部であるテキストには、このプロパティが付与されており、かつ nil
ではない必要があります。
Font Lock がテキスト範囲をハイライトしようとする際、まず必要に応じてその範囲の境界を拡張し、font-lock-multiline
プロパティが付与されたテキスト内に範囲が含まれないようにします。次に、範囲内の font-lock-multiline プロパティをすべて削除し、ハイライトを行います。ハイライト仕様(主に
font-lock-keywords)は、適宜、その都度このプロパティを再設定する必要があります。
警告: 広範囲のテキストに font-lock-multiline プロパティを使用しないでください。再ハイライト処理が遅くなります。
font-lock-multiline 変数が t に設定されている場合、Font Lock は複数行の構文に対して font-lock-multiline プロパティを自動的に追加しようとします。ただし、これにより Font
Lock
の動作が多少遅くなるため、万能な解決策とは言えません。一部の複数行構文を見落としたり、プロパティが必要以上に大きくなったり小さくなったりすることがあります。
matcher
が関数である要素の場合、その関数は、たとえごく一部のみがハイライトされるとしても、サブマッチ 0
が関連するマルチライン構造全体をカバーするようにしなければなりません。font-lock-multiline プロパティを手動で追加する方が、同様に簡単な場合が多いです。
font-lock-multiline
プロパティは、適切な再フォント化を確実にするためのものであり、新しい複数行構成を自動的に識別するものではありません。それらを識別するには、Font
Lock
モードが一度に十分な大きさのチャンク単位で動作する必要があります。多くの場合、これは偶然に起こるため、複数行構成が魔法のように機能しているかのような印象を与えることがあります。font-lock-multiline 変数を non-nil
に設定すると、検出された構成のハイライトがそれ以降適切に更新されるため、この印象はさらに強まります。しかし、これは確実に動作するわけではありません。
複数行の構文を確実に検出するには、Font Lockモードが処理する前にテキストにfont-lock-multilineプロパティを手動で付与するか、font-lock-fontify-region-functionを使用する必要があります。