フェイスを定義する通常の方法はdefface
マクロを通じて定義する方法です。このマクロはフェイス名(シンボル)をデフォルトのフェイスspec(face
spec)と関連付けます。フェイスspecとは任意の与えられた端末上でフェイスがどの属性をもつべきかを指定する構文です。たとえばあるフェイスspecは高カラー端末ではあるフォアグラウンドカラーし、低カラー端末では異なるフォアグラウンドカラーを指定するかもしれません。
値がフェイス名であるような変数を作りたがる人がいます。ほとんどの場合には、これは必要ありません。通常の手順はdefface
でフェイスを定義して、その名前を直接使用することです。
(通常はdefface
により)一度フェイスを定義したら、Emacsを再起動する以外にそのフェイスを安全に未定義にすることはできません。
このマクロはspecによりデフォルトフェイスspecが与えられるような名前つきフェイスとしてfaceを宣言する。シンボルfaceはクォートせずに‘-face’で終わらないこと(冗長かもしれない)。引数docはフェイスにたいするドキュメント文字列。追加のkeyword引数はdefgroup
やdefcustom
の場合と同じ意味をもつ(一般的なキーワードアイテムを参照)。
faceがすでにデフォルトフェイスspecをもつ場合には、このマクロは何も行わない。
デフォルトフェイスspecは何もカスタマイゼーション(カスタマイゼーション設定を参照)の効果がないときのfaceの外観を決定する。faceが(Customテーマやinitファイルから読み込んだカスタマイズにより)すでにカスタマイズ済みなら、その外観はデフォルトフェイスspecのspecをオーバーライドするカスタムフェイスspecにより決定される。しかしその後カスタマイゼーションが削除されたら、faceの外観は再びそのデフォルトフェイスspecにより決定されるだろう。
例外としてC-M-x (eval-defun
)、あるいはEmacs LispモードでC-x C-e
(eval-last-sexp
)によりdefface
を評価した場合には、これらコマンドの特別な機能によりdefface
の指示をフェイスが正確に反映するように、そのフェイス上の任意のカスタムフェイス仕様をオーバーライドする。
spec引数は異なる種別の端末上でそのフェイスがどのような外観で表示されるべきかを示すフェイスspec。これは各要素が以下の形式であるようなalistであること
(display . plist)
displayは端末のクラス(以下参照)を指定する。plistはそのような端末上でフェイスがどのような外観かを指定するフェイス属性とその値からなるプロパティリストであること。後方互換性のために(display
plist)
のように要素を記述することもできる。
specの要素のdisplayの部分は、その要素がマッチする端末を決定する。与えられた端末にたいして複数の要素がマッチした場合には、最初にマッチした要素がその端末にたいして使用される。displayには以下の3つが可能:
default
specのこの要素はどの端末にもマッチしない。かわりにすべての端末に適用されるデフォルトを指定する。この要素が使用する場合には、specの最初の要素でなければならない。この後の要素はこれらのデフォルトの一部、またはすべてをオーバーライドできる。
t
specのこの要素はすべての端末にマッチする。したがってspecの後続要素が使用されることはない。t
は通常はspecの最後(か唯一)の要素として使用される。
displayがリストなら各要素は(characteristic
value…)
という形式をもつこと。ここでcharacteristicは端末をクラス分けする方法、valueはdisplayに適用されるべき可能なクラス分類。characteristicに利用可能な値は:
type
その端末が使用するウィンドウシステムの種類でgraphic
(任意のグラフィック対応ディスプレイ)、x
、pc
(MS-DOSコンソール)、w32
(MS Windows 9X/NT/2K/XP)、haiku
(Haiku)、pgtk
(pure GTK)、android
(Android)、またはtty
(グラフィック非対応ディスプレイ)のいずれか。window-systemを参照のこと。
class
その端末がサポートするカラーの種類でありcolor
、grayscale
かmono
のいずれか。
background
バックグラウンドの種類でありlight
かdark
のいずれか。
min-colors
その端末がサポートするべき最小カラー数を表す整数。端末のdisplay-color-cells
の値が少なくとも指定された整数ならその端末にマッチ。
supports
その端末がvalue…で与えられたフェイス属性を表示可能か否か(フェイスの属性を参照)。このテストがどのように行われるかについてのより正確な情報はDisplay Face Attribute Testingを参照のこと。
与えられたcharacteristicにたいしてdisplayの要素が複数のvalueを指定する場合には、いずれの値も許容され得る。displayが複数の要素をもつ場合には、各要素は異なるcharacteristicを指定すること。その端末のそれぞれのcharacteristicはdisplay内で指定された値のいずれか1つとマッチしなければならない。
たとえば以下は標準フェイスhighlight
の定義です:
(defface highlight '((((class color) (min-colors 88) (background light)) :background "darkseagreen2") (((class color) (min-colors 88) (background dark)) :background "darkolivegreen") (((class color) (min-colors 16) (background light)) :background "darkseagreen2") (((class color) (min-colors 16) (background dark)) :background "darkolivegreen") (((class color) (min-colors 8)) :background "green" :foreground "black") (t :inverse-video t)) "Basic face for highlighting." :group 'basic-faces)
内部的にはEmacsはフェイスのシンボルプロパティface-defface-spec
内にそれぞれのフェイスのデフォルトspecを格納します(シンボルのプロパティを参照)。saved-face
プロパティはカスタマイゼーションバッファーを使用してユーザーが保存した任意のフェイスspecを格納します。customized-face
プロパティはカレントセッションにたいしてカスタマイズされた保存されていないフェイスspecを格納します。そしてtheme-face
プロパティはそのフェイスにたいするアクティブなカスタマイゼーションセッティングと、フェイスspecをもつCustomテーマを関連付けるalistです。そのフェイスのドキュメント文字列はface-documentation
プロパティ内に格納されます。
フェイスは通常はdefface
を使用して1回だけ宣言されて、その外観にたいするそれ以上の変更はCustomizeフレームワーク(Customizeユーザーインターフェースかcustom-set-faces
関数を通じて。カスタマイゼーションの適用を参照)、またはフェイスリマッピング(フェイスのリマップを参照)により行われます。Lispから直接フェイスspec変更を要する稀な状況ではface-spec-set
関数を使用できます。
この関数はface
にたいするフェイスspecとしてspecを適用する。specは上述したdefface
にたいするフェイスspecであること。
この関数はもしfaceが既存のものでなければ有効なフェイス名としてfaceを定義して、既存フレームのその属性の(再)計算も行う。
オプション引数spec-typeはどのspecをセットするかを決定する。これが省略かnil
、またはface-override-spec
なら、この関数はオーバーライドspec(override
spec)をセットする。これは後述するface上の他のすべてのフェイスspecをオーバーライドする。これはCustomのコード外部からこの関数を呼び出す際に有用。spec-typeがcustomized-face
かsaved-face
なら、この関数はカスタマイズされたspec、または保存されたカスタムspecをセットする。face-defface-spec
なら、この関数はデフォルトフェイスspec(defface
によりセットされるものと同一)をセットする。reset
なら、この関数はfaceからすべてのカスタマイゼーションspecとオーバーライドspecをクリアーする(この場合にはspecの値は無視される)。spec-typeの他の任意の値がフェイスspecに及ぼす効果は内部的な使用のために予約済みだが、それでも後述するようにこの関数はface自体の定義を行い属性を再計算する。