バッファー内のすべてのテキストにたいしてテキストプロパティを計算するかわりに、何かがテキスト範囲に依存している場合にはテキストプロパティを計算するようにアレンジできます。
プロパティとともにバッファーからテキストを抽出するプリミティブは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
の関数にこのプロパティ、同様に他のプロパティを処理対象の文字に追加させることがこの機能の通常の用途である。この方法では同じテキストにたいして、それらの関数が何度も呼び出されるのを防ぐことができる。