次: , 前: Format Properties, 上: Text Properties


31.19.6 テキスト属性のスティッキ性

自己挿入文字は、通常、先行する文字と同じ属性を持ちます。 これを属性の継承(inheritance)と呼びます。

Lispプログラムでは、挿入基本関数を選べば、 継承して挿入したり継承せずに挿入できます。 insertなどの普通のテキスト挿入関数は、 いかなる属性も継承しません。 これらは、挿入する文字列の属性をそのまま持ったテキストを挿入し、 それ以外の属性はありません。 キルリングなどのある文脈から別の文脈へテキストをコピーするプログラムには、 これは正しい動作です。 継承して挿入するには、本節で述べる特別な基本関数を使います。 自己挿入文字はこれらの基本関数を使っているので、属性を継承します。

継承して挿入するとき、どの属性を継承するかは、 2つの特別な属性front-stickyrear-nonstickyに依存します。

文字のうしろに挿入すると、その文字の後続スティッキ(rear-sticky) である属性を継承します。 文字のまえに挿入すると、その文字の先行スティッキ(front-sticky) である属性を継承します。 デフォルトでは、テキスト属性は先行スティッキではなく後続スティッキです。 したがって、デフォルトでは、まえの文字のすべての属性を継承して、 うしろの文字からはなにも継承しません。 特定の属性のスティッキ性を指定することで、異なるふるまいを指定できます。

文字の属性front-stickytであると、 その文字のすべての属性は先行スティッキです。 属性front-stickyがリストであると、 リストに現れる名前のその文字の属性は先行スティッキです。 たとえば、文字の属性front-stickyの値が(face read-only)であると、 この文字のまえに挿入するとこの文字の属性faceread-onlyを 継承しますが、それ以外には継承しません。

rear-nonstickyは反対の働きをします。 すべての属性はデフォルトでは後続スティッキですから、 属性rear-nonstickyはどの属性が 後続スティッキでないかを指定します。 文字の属性rear-nonstickytであると、 その文字には後続スティッキである属性はありません。 属性rear-nonstickyがリストであると、 リストに名前が現れない限り、 属性は後続スティッキです。

継承するようにテキストを挿入すると、 まえの文字からは後続スティッキであるすべての属性を継承し、 うしろの文字からは先行スティッキであるすべての属性を継承します。 両側の文字に異なるスティッキ性の同じ属性がある場合には、 まえの文字の属性が優先します。

属性を継承してテキストを挿入する関数はつぎのとおりです。

— 機能: insert-and-inherit &rest strings

関数insertと同様に文字列stringsを挿入するが、 前後のテキストから任意のスティッキ性の属性を継承する。

— 機能: insert-before-markers-and-inherit &rest strings

関数insert-before-markersと同様に文字列stringsを挿入するが、 前後のテキストから任意のスティッキ性の属性を継承する。

継承しない普通の挿入関数については、See Insertion