自己挿入文字(ユーザーが入力した際にバッファに挿入される文字。ユーザーレベルの挿入コマンドを参照)は、通常、直前の文字と同じプロパティを持ちます。これをプロパティの継承と呼びます。
これに対し、Lispプログラムでは、挿入プリミティブの選択に応じて、継承あり、または継承なしで挿入を行うことができます。insertのような通常のテキスト挿入関数は、いかなるプロパティも継承しません。これらの関数は、挿入対象の文字列が持つプロパティのみを用いてテキストを挿入し、それ以外のプロパティは継承しません。これは、あるコンテキストから別のコンテキストへ(例えばキルリングへの挿入やキルリングからの取り出しなど)テキストをコピーするプログラムにおいて適切です。継承ありで挿入を行うには、本節で説明する特殊なプリミティブを使用してください。自己挿入文字がプロパティを継承するのは、これらのプリミティブを用いて動作するためです。
継承を伴う挿入を行う際、どのプロパティがどこから継承されるかは、どのプロパティがスティッキーであるかによって決まります。文字の後への挿入では、そのプロパティのうち後方スティッキーなものが継承されます。文字の前への挿入では、そのプロパティのうち前方スティッキーなものが継承されます。同一プロパティに対して双方が異なるスティッキー値を持つ場合、直前の文字の値が優先されます。
デフォルトでは、テキストプロパティは後方粘着性を持ちますが、前方粘着性は持ちません。したがって、直前の文字のすべてのプロパティを継承し、後続の文字からは何も継承しないのがデフォルトとなります。
2つの特定のテキストプロパティ front-sticky と rear-nonsticky、および変数 text-property-default-nonsticky
を使用することで、さまざまなテキストプロパティの固定・非固定を制御できます。この変数を使えば、特定のプロパティに対して異なるデフォルト値を指定できます。また、これら2つのテキストプロパティを用いることで、テキスト内の任意の箇所において、特定のプロパティを固定または非固定に設定できます。
文字の front-sticky プロパティが t である場合、そのすべてのプロパティはフロントスティッキーとなります。front-sticky
プロパティがリストである場合、その文字のスティッキープロパティとは、リストに名前が含まれているプロパティのことです。例えば、文字が値 (face read-only) の front-sticky プロパティを持っている場合、その文字の前に挿入される要素は、その face プロパティと read-only
プロパティを継承できますが、それ以外のプロパティは継承しません。
The rear-nonsticky property works the opposite
way. Most properties are rear-sticky by default, so the rear-nonsticky property says which properties are not rear-sticky. If a character’s rear-nonsticky property is t,
then none of its properties are rear-sticky. If the rear-nonsticky property is a list, properties are
rear-sticky unless their names are in the list.
このバッファローカル変数には、バッファ内の各種テキストプロパティのデフォルトのリアスティッキネスを定義するalistが格納されています。各要素は
(property . nonstickiness) という形式をとり、特定のテキストプロパティ property のスティッキネスを定義します。
nonstickiness が nil
でない場合、プロパティ property
はデフォルトで後方非粘着となります。すべてのプロパティはデフォルトで前方非粘着であるため、これにより property はデフォルトで両方向とも非粘着となります。
テキストプロパティ front-sticky および rear-nonsticky は、使用された場合、text-property-default-nonsticky で指定されたデフォルトの nonstickiness よりも優先されます。
プロパティを継承してテキストを挿入する関数は以下の通りです。
関数 insert と同様に文字列 strings
を挿入しますが、隣接するテキストからスティッキーなプロパティを継承してください。
関数 insert-before-markers と同様に文字列 strings を挿入しますが、隣接するテキストからスティッキーなプロパティを継承してください。
継承しない通常の挿入機能については、テキストの挿入を参照してください。