プロパティを変更するプリミティブは、バッファーや文字列内の指定されたテキスト範囲に適用されます。関数set-text-properties
(セクションの最後を参照)は、その範囲内のテキストのプロパティリスト全体をセットします。名前を指定することにより特定のプロパティだけを追加、変更、削除するためにも有用です。
テキストプロパティはバッファー(か文字列)のコンテンツの一部とみなされ、かつスクリーン上でのバッファーの見栄えに影響を与えることができるので、バッファー内のテキストプロパティの変更はすべてバッファーを変更済みとマークします。バッファーテキストプロパティの変更もアンドゥできます(アンドゥを参照)。バッファー内の位置は1から始まりますが、文字列内の位置は0から始まります。
この関数は文字列かバッファーobject内のstartとendの間のテキストにたいして、プロパティpropにvalueをセットする。objectがnil
ならデフォルトはカレントバッファー。
この関数は文字列かバッファーobject内のstartとendの間のテキストにたいして、テキストプロパティを追加またはオーバーライドする。objectがnil
ならデフォルトはカレントバッファー。
引数propsには追加するプロパティを指定する。これはプロパティリストの形式(プロパティリストを参照)、つまりプロパティ名と対応する値が交互に出現するような要素を含むリストであること。
関数が実際に何らかのプロパティの値を変更したらt
、それ以外(
propsがnil
、またはプロパティの値がテキスト内のプロパティの値と一致している場合)はnil
がリターン値となる。
たとえば以下はテキストの範囲にcomment
とface
のプロパティをセットする例:
(add-text-properties start end '(comment t face highlight))
この関数は文字列かバッファーobject内のstartとendの間のテキストから、指定されたテキストプロパティを削除する。objectがnil
ならデフォルトはカレントバッファー。
引数propsは削除するプロパティを指定する。これはプロパティリストの形式(プロパティリストを参照)、つまりプロパティ名と対応する値が交互に出現するような要素を含むリストであること。しかし問題となるのは名前であって付随する値は無視される。たとえばface
プロパティを削除するには以下のようにすればよい。
(remove-text-properties start end '(face nil))
関数が実際に何らかのプロパティの値を変更したらt
、それ以外(
propsがnil
、または指定されたテキスト内にそれらのプロパティをもつ文字がない場合)はnil
がリターン値となる。
特定のテキストからすべてのテキストプロパティを削除するには、新たなプロパティリストにnil
を指定してset-text-properties
を使用すればよい。
remove-text-properties
と同様だが、list-of-propertiesがプロパティ名と値が交互になったリストではなくプロパティ名だけのリストである点が異なる。
この関数は文字列かバッファーobject内のstartからendの間のテキストにたいするテキストプロパティリストを完全に置き換える。objectがnil
ならデフォルトはカレントバッファー。
引数propsは新たなプロパティリスト。これはプロパティ名と対応する値が交互となるような要素のリストであること。
set-text-properties
のリターン後には、指定された範囲内のすべての文字は等しいプロパティをもつ。
propsがnil
なら、指定されたテキスト範囲からすべてのプロパティを取り除く効果がある。以下は例:
(set-text-properties start end nil)
この関数のリターン値を信用してはならない。
この関数はstartとendの間のテキストのテキストプロパティface
にフェイスfaceを追加するように動作する。faceはフェイス名、もしくはanonymousフェイス(anonymous
face: 無名フェイス)のようなface
プロパティ(特殊な意味をもつプロパティを参照)にたいして有効な値であること(フェイスを参照)。
リージョン内の任意のテキストがすでに非nil
のface
プロパティをもつ場合には、それらのフェイスは保たれる。この関数はface
プロパティに最初の要素(デフォルト)がface、以前に存在していたフェイスが残りの要素であるようなフェイスのリストをセットする。オプション引数appendpが非nil
なら、faceはかわりにリストの最後に追加される。フェイスリスト内では、各属性にたいして最初に出現する値が優先されることに注意。
たとえば以下のコードではstartとendの間のテキストにグリーン斜体のフェイスを割り当てるだろう:
(add-face-text-property start end 'italic) (add-face-text-property start end '(:foreground "red")) (add-face-text-property start end '(:foreground "green"))
オプション引数objectが非nil
なら、それはカレントバッファーではなく動作するバッファーか文字列を指定する。objectが文字列ならstartとendは0基準で文字列内をインデックス付けする。
文字列にテキストプロパティを付するもっとも簡単な方法はpropertize
です:
この関数はテキストプロパティpropertiesを追加したstringのコピーをリターンする。これらのプロパティはリターンされる文字列内のすべての文字に適用される。以下はface
プロパティとmouse-face
プロパティとともに文字列を構築する例:
(propertize "foo" 'face 'italic 'mouse-face 'bold-italic) ⇒ #("foo" 0 3 (mouse-face bold-italic face italic))
文字列のさまざまな部分に異なるプロパティをputするには、それぞれの部分をpropertize
で構築して、それらをconcat
で結合すればよい:
(concat (propertize "foo" 'face 'italic 'mouse-face 'bold-italic) " and " (propertize "bar" 'face 'italic 'mouse-face 'bold-italic)) ⇒ #("foo and bar" 0 3 (face italic mouse-face bold-italic) 3 8 nil 8 11 (face italic mouse-face bold-italic))
プロパティではなくバッファーからテキストをコピーする関数buffer-substring-no-properties
についてはバッファーのコンテンツを調べるを参照してください。
バッファーを変更せずにバッファーにテキストプロパティを追加したり削除したければ、その呼び出しを上記のwith-silent-modifications
マクロでラップできます。バッファーの変更を参照してください。