バッファ内のすべてのテキストに対してテキストプロパティを計算する代わりに、何らかの要因で必要になった場合に、テキストの一部に対してのみプロパティを計算するように構成できます。
バッファからプロパティと共にテキストを抽出するプリミティブは buffer-substring
です。プロパティを調べる前に、この関数は異常フック buffer-access-fontify-functions を実行します。
この変数には、テキストプロパティを計算するための関数リストが格納されています。buffer-substring
がバッファの一部のテキストおよびテキストプロパティをコピーする前に、このリストにあるすべての関数を呼び出します。各関数には、アクセス対象のバッファ範囲を指定する2つの引数が渡されます。(バッファ自体は常に現在のバッファとなります。)
buffer-substring-no-properties
関数は、いずれにせよテキストプロパティを無視するため、これらの関数を呼び出しません。
バッファの同一箇所に対してフック関数が複数回呼び出されるのを防ぐには、変数 buffer-access-fontified-property を使用できます。
この変数の値がnil以外の場合、それはテキストプロパティ名として使用されるシンボルとなります。そのテキストプロパティの値がnil以外であるということは、この文字に対する他のテキストプロパティがすでに計算済みであることを意味します。
buffer-substring で指定された範囲内のすべての文字が、このプロパティに nil 以外の値を持っている場合、buffer-substring は buffer-access-fontify-functions
関数を呼び出しません。これらの文字がすでに適切なテキストプロパティを持っていると想定し、単に既存のプロパティをコピーします。
この機能の一般的な使い方は、buffer-access-fontify-functions
関数が操作対象の文字にこのプロパティやその他のプロパティを追加するというものです。これにより、同じテキストに対して繰り返し呼び出されるのを避けることができます。