テキスト属性の典型的な用途では、 ほとんどの場合多くの連続した文字の1つの属性には同じ値があります。 1つずつ文字を調べるようにプログラムするよりは、 同じ属性値を持つテキストの塊を処理するほうがとても速いです。
このために使える関数をここで説明します。
これらは属性値の比較にeq
を使います。
objectのデフォルトは、すべての場合でカレントバッファです。
高い効率のためには、これらの関数に引数limitを使うことが重要であり、 1つの属性を探す関数には特にあてはまります。 さもないと、読者が望む属性が変更されないような場合、 それらの関数はバッファの末尾まで走査して長い時間を費すことになります。
これらの関数はポイントを移動しませんが、そのかわりに
位置(あるいはnil
)を返します。
位置はつねに2つの文字のあいだにあることに注意してください。
これらの関数が返す位置は、異なる属性を持つ2つの文字のあいだです。
この関数は、文字列やバッファであるobject内の位置posから テキスト属性のいずれかが異なるまでテキストを走査し、その変化する位置を返す。 いいかえれば、posの直後の文字のテキスト属性とは異なる 属性を持つposのあとにある最初の文字の位置を返す。
limitが
nil
以外であると、limitの位置で走査を終える。 その箇所まで異なる属性がないと、next-property-change
はlimitを返す。limitが
nil
でありobjectの末尾まで属性に変化がないと、 値はnil
である。 値がnil
以外であると、それはposより大きいか等しい位置である。 値がposに等しいのは、limitがposに等しい場合のみである。バッファからすべての属性が同じであるテキストの塊を 走査する方法の例をつぎに示す。
(while (not (eobp)) (let ((plist (text-properties-at (point))) (next-change (or (next-property-change (point) (current-buffer)) (point-max)))) ポイントからnext-changeまでのテキストを処理する... (goto-char next-change)))
この関数は、文字列やバッファであるobject内の位置posから 属性propが異なるまでテキストを走査し、その変化する位置を返す。 いいかえれば、posの直後の文字の属性propとは異なる 属性propをもつposのあとにある最初の文字の位置を返す。
limitが
nil
以外であると、limitの位置で走査を終える。 その箇所まで異なる属性がないと、next-single-property-change
はlimitを返す。limitが
nil
でありobjectの末尾まで属性に変化がないと、 値はnil
である。 値がnil
以外であると、それはposより大きいか等しい位置である。 値がposに等しいのは、limitがposに等しい場合のみである。
これは
next-property-change
と同様であるが、 前方へではなくposから後方へ走査する。 値がnil
以外であると、それはposより小さいか等しい位置である。 値がposに等しいのは、limitがposに等しい場合のみである。
これは
next-single-property-change
と同様であるが、 前方へではなくposから後方へ走査する。 値がnil
以外であると、それはposより小さいか等しい位置である。 値がposに等しいのは、limitがposに等しい場合のみである。
これは
next-property-change
と同様であるが、 テキスト属性に加えてオーバレイも対象にする。 この関数はカレントバッファにのみ作用するため、 objectを表す引数はない。 どちらかの属性が異なるつぎの位置を返す。