フェイスを定義する一般的な方法は、defface
マクロを用いることです。このマクロは、フェイス名(シンボル)をデフォルトの フェイススペック
に関連付けます。フェイススペックとは、任意の端末においてフェイスが持つべき属性を指定する構成要素です。例えば、フェイススペックによって、高色端末ではある前景色を、低色端末では別の前景色を指定するといったことができます。
人名を値とする変数を作成したくなることがあります。しかし、ほとんどの場合、その必要はありません。通常の手順は、defface でフェイスを定義し、その名前を直接使用することです。
なお、一度フェイスを定義すると(通常は defface を用いて)、Emacs
を再起動しない限り、後から安全にそのフェイスを解除することはできない点に注意してください。
このマクロは、face を、デフォルトのフェイス仕様が spec で指定される名前付きフェイスとして宣言します。シンボル face をクォートしてはならず、また ‘-face’ で終わるべきではありません(それは冗長になります)。引数 doc は、そのフェイスのドキュメント文字列です。追加の引数 keyword は、defgroup および defcustom と同様の意味を持ちます(共通項目キーワード を参照してください)。
face に既にデフォルトのフェイス仕様が設定されている場合、このマクロは何もしません。
デフォルトのフェイス仕様は、カスタマイズが適用されていない場合の face の外観を決定します(カスタマイズ設定 を参照)。face がすでにカスタマイズされている場合(カスタムテーマ経由、または init ファイルから読み込まれたカスタマイズ経由)、その外観はカスタムフェイス仕様によって決定され、デフォルトのフェイス仕様 spec よりも優先されます。ただし、その後カスタマイズが削除されると、face の外観は再びデフォルトのフェイス仕様によって決定されます。
例外として、Emacs Lispモードで defface フォームを C-M-x (eval-defun) または C-x C-e (eval-last-sexp)
で評価する場合、これらのコマンドの特殊な機能によってそのフェイスに設定された任意のカスタムフェイス指定が上書きされ、フェイスが defface の指定通りの状態になります。
spec 引数は フェイス仕様 であり、さまざまな種類の端末でフェイスをどのように表示すべきかを規定します。これはアリストであり、各要素は以下の形式をとります。
(display . plist)
display は端末のクラスを指定します(後述)。plist
はフェイス属性とその値のプロパティリストであり、当該端末上でフェイスがどのように表示されるかを指定します。後方互換性のため、要素を (display plist) と記述することも可能です。
spec の要素における display の部分は、その要素がどの端末にマッチするかを決定します。spec の複数の要素が特定の端末にマッチする場合、最初にマッチした要素がその端末に使用されます。display には3つの可能性があります:
defaultspec のこの要素は、いかなる端末にも一致しません。代わりに、すべての端末に適用されるデフォルト値を指定します。この要素を使用する場合、spec の最初の要素である必要があります。以下の各要素は、これらのデフォルト値の一部またはすべてを上書きできます。
tspec のこの要素は、すべての終端記号に一致します。したがって、それ以降の 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(純粋なGTK用)、android(Android用)、またはtty(グラフィックス非対応のディスプレイ)。ウィンドウシステムを参照。
classターミナルがサポートする色(color、grayscale、またはmonoのいずれか)。
background背景の種類—lightまたはdark。
min-colorsターミナルがサポートすべき最小の色数を表す整数。display-color-cells
の値が指定された整数以上である場合、そのターミナルと一致します。
supports端末が value で指定された顔属性(顔属性 を参照)を表示できるかどうか。このテストが具体的にどのように行われるかについての詳細は、顔属性の表示テスト を参照してください。
display の要素が、特定の characteristic に対して複数の value を指定している場合、それらの値のいずれかが認められます。display に複数の要素がある場合、各要素は異なる characteristic を指定する必要があります。その場合、端末の各特性は、display で当該端末に指定された value のいずれかと一致しなければなりません。
例えば、標準面 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シンボルプロパティに格納されています(シンボルプロパティを参照)。saved-faceプロパティには、ユーザーがカスタマイズバッファを使用して保存したフェイス仕様が格納され、customized-faceプロパティには、現在のセッション向けにカスタマイズされたが保存されていないフェイス仕様が格納されます。そしてtheme-faceプロパティには、有効なカスタマイズ設定およびカスタムテーマと、そのフェイスの仕様を対応付けたalistが格納されます。フェイスのドキュメント文字列はface-documentationプロパティに格納されています。
通常、フェイスは defface
を用いて一度だけ宣言され、それ以降の外観の変更は、Customize フレームワーク(例:Customize ユーザーインターフェースや custom-set-faces 関数経由。カスタマイズの適用 を参照)、またはフェイスのリマッピング(フェイスのリマッピング を参照)を用いて適用されます。稀に
Lisp から直接フェイスの仕様を変更する必要がある場合は、face-spec-set
関数を使用できます。
この関数は、face のフェイス指定として spec
を適用します。spec は、前述の defface
のドキュメントに記載されている通り、フェイス指定である必要があります。
この関数はまた、face がまだ有効なフェイス名でない場合にそれを有効なフェイス名として定義し、既存のフレーム上でその属性を(再)計算します。
オプション引数 spec-type
は、どのスペックを設定するかを決定します。これが省略されているか、あるいは nil または
face-override-spec である場合、この関数は オーバーライドスペック を設定します。これは、以下に挙げる他のすべての型の face
におけるフェイススペックを上書きします。これは、カスタムコード以外でこの関数を呼び出す際に有用です。spec-type が customized-face または
saved-face
である場合、この関数はそれぞれカスタマイズ済みスペック、または保存済みカスタムスペックを設定します。face-defface-spec である場合、この関数はデフォルトのフェイススペック(defface で設定されるものと同じ)を設定します。reset である場合、この関数は face
からすべてのカスタマイズスペックおよびオーバーライドスペックをクリアします(この場合、spec
の値は無視されます)。spec-type
のその他の値がフェイススペックに及ぼす影響は内部利用に限定されていますが、関数は前述の通り、引き続き face 自体を定義し、その属性を再計算します。