Next: , Previous: , Up: Faces   [Contents][Index]


37.12.2 フェイスの定義

フェイスを定義する通常の方法はdeffaceマクロを通じて定義する方法です。このマクロはフェイス名(シンボル)をデフォルトのフェイスspec(face spec)と関連付けます。フェイスspecとは任意の与えられた端末上でフェイスがどの属性をもつべきかを指定する構文です。たとえばあるフェイスspecは高カラー端末ではあるフォアグラウンドカラーし、低カラー端末では異なるフォアグラウンドカラーを指定するかもしれません。

値がフェイス名であるような変数を作りたがる人がいます。ほとんどの場合には、これは必要ありません。通常の手順はdeffaceでフェイスを定義して、その名前を直接使用することです。

Macro: defface face spec doc [keyword value]…

このマクロはspecによりデフォルトフェイスspecが与えられるような名前つきフェイスとしてfaceを宣言する。シンボルfaceはクォートせずに‘-face’で終わらないこと(冗長かもしれない)。引数docはフェイスにたいするドキュメント文字列。追加のkeyword引数はdefgroupdefcustomの場合と同じ意味をもつ(Common Keywordsを参照)。

faceがすでにデフォルトフェイスspecをもつ場合には、このマクロは何も行わない。

デフォルトフェイスspecは何もカスタマイゼーション(Customizationを参照)の効果がないときのfaceの外観を決定する。faceが(Customテーマやinitファイルから読み込んだカスタマイズにより)すでにカスタマイズ済みなら、その外観はデフォルトフェイスspecのspecをオーバーライドするカスタムフェイスspecにより決定される。しかしその後カスタマイゼーションが削除されたら、faceの外観は再びそのデフォルトフェイスspecにより決定されるだろう。

例外としてEmacs LispモードでC-M-x (eval-defun)からdeffaceを評価した場合には、eval-defunの特別な機能により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は端末をクラス分けする方法、valuedisplayに適用されるべき可能なクラス分類。characteristicに利用可能な値は:

type

その端末が使用するウィンドウシステムの種類でgraphic (任意のグラフィック対応ディスプレイ)、xpc (MS-DOSコンソール)、w32 (MS Windows 9X/NT/2K/XP)、またはtty (グラフィック非対応ディスプレイ)のいずれか。window-systemを参照のこと。

class

その端末がサポートするカラーの種類でありcolorgrayscalemonoのいずれか。

background

バックグラウンドの種類でありlightdarkのいずれか。

min-colors

その端末がサポートするべき最小カラー数を表す整数。端末のdisplay-color-cellsの値が少なくとも指定された整数ならその端末にマッチ。

supports

その端末がvalue…で与えられたフェイス属性を表示可能か否か(Face Attributesを参照)。このテストがどのように行われるかについてのより正確な情報は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を格納します(Symbol Propertiesを参照)。saved-faceプロパティはカスタマイゼーションバッファーを使用してユーザーが保存した任意のフェイスspecを格納します。customized-faceプロパティはカレントセッションにたいしてカスタマイズされた保存されていないフェイスspecを格納します。そしてtheme-faceプロパティはそのフェイスにたいするアクティブなカスタマイゼーションセッティングと、フェイスspecをもつCustomテーマを関連付けるalistです。そのフェイスのドキュメント文字列はface-documentationプロパティ内に格納されます。

フェイスは通常はdeffaceを使用して1回だけ宣言されて、その外観にたいするそれ以上の変更はCustomizeフレームワーク(Customizeユーザーインターフェースかcustom-set-faces関数を通じて。Applying Customizationsを参照)、またはフェイスリマッピング(Face Remappingを参照)により行われます。Lispから直接フェイスspec変更を要する稀な状況ではface-spec-set関数を使用できます。

Function: face-spec-set face spec &optional spec-type

この関数はfaceにたいするフェイスspecとしてspecを適用する。specは上述したdeffaceにたいするフェイスspecであること。

この関数はもしfaceが既存のものでなければ有効なフェイス名としてfaceを定義して、既存フレームのその属性の(再)計算も行う。

引数spec-typeはどのspecをセットするべきかを決定する。これがnilface-override-specなら、この関数はオーバーライドspec(override spec)をセットする。これはface上の他のすべてのフェイスspecをオーバーライドする。customized-facesaved-faceなら、この関数はカスタマイズされたspec、または保存されたカスタムspecをセットする。face-defface-specならこの関数はデフォルトフェイスspec(deffaceによりセットされるものと同一)をセットする。resetならこの関数はfaceからすべてのカスタマイゼーションspecとオーバーライドspecをクリアーする(この場合にはspecの値は無視される)。spec-typeにたいする他のすべての値は内部的な使用のために予約済み。