Emacsでは(クリックできる)ボタンや小さい(何かを説明するための)グラフィックスが使える場合があります。Emacsは異なる機能をもつ多種多様なシステムで利用できる、更に好みはユーザーごとにそれぞれ異なることから、Emacsはこれを処理するための機能として、テーマと同じようにカスタマイズでき、優美な装飾とアクセシビリティをもつアイコン(Icon)を提供します。
ここで中心となるのはdefine-icon
というマクロです。以下に単純な例を示します:
(define-icon outline-open button '((image "right.svg" "open.xpm" "open.pbm" :height line) (emoji "▶️") (symbol "▶" "➤") (text "open" :face icon-button)) "Icon used for buttons for opening a section in outline buffers." :version "29.1" :help-echo "Open this section")
実際にどの選択肢が表示されるかはユーザーオプションicon-preference
(Icons in The
GNU Emacs Manualを参照)の値と、カレントフレームの端末が実際に表示できるかどうかの実行時チェックの結果に依存します。
上記の例はoutline-open
をアイコンとして定義するマクロです。これはbutton
と呼ばれるアイコンからプロパティを継承します(バッファーにはクリック可能なボタンとして挿入されることを意図している)。その後にはアイコンタイプ(icon
type)のリストと実際のアイコンのシェイプ(形状)が続きます。更にドキュメント文字列や追加の情報とプロパティを含むさまざまキーワードも存在します。
アイコンをインスタンス化するためにはicon-string
を使用します。これはカレントのCustomizeテーマ、ユーザーオプションicon-preference
、そして最後にEmacsが実際に何を表示できるかを調べます。icon-preference
が(image
emoji symbol text)
(これらすべての形式を許容するアイコン)の場合には、icon-string
はまずEmacsがイメージを表示できるのか、そして異なるイメージフォーマットそれぞれについてサポートしているかどうかをチェックします。これが失敗したら、Emacsは(カレントフレームにおいて)emojiを表示できるかどうかをチェックします。これが失敗すると、対象となるシンボルを表示できるかどうかをチェックして、それが失敗したら平文テキストのバージョンが使用されることになります。
たとえばもしもicon-preference
にimage
やemoji
が含まれていなければ、それらのエントリーはスキップされます。
コードはどんな状況下においても安心してicon-string
を呼び出すことができ、ユーザーが使っているのがグラフィカルな端末とテキスト端末のどちらなのか、あるいはEmacsが何の機能とともにビルドされているかに関わらず、読み取り可能な何かがスクリーン上に表示されることが保証されているのです。
アイコンname
(シンボル)を代替表示specとともに定義する。後でicon-string
を使ってインスタンス化できる。nameは結果となるキーワード名。
結果として得られるアイコンはそのspecをparent、その親、...から継承する。もっとも下位の子孫のspecが優先される。
specsはアイコン仕様のリスト。各仕様の1つ目の要素はタイプ、残りはそのタイプのアイコンに使用される何かしら、その後はキーワードリスト。以下は利用可能なアイコンタイプ:
image
この場合には候補として多くのイメージがリストされているかもしれない。EmacsはカレントのEmacsインスタンスが表示できる最初の候補を選択する。リストされているイメージが絶対ファイル名ならそれを使い、そうでなければimage-load-path
(イメージの定義を参照)にリストされたディレクトリーを検索する。
emoji
(恐らくはカラフルな)emoji。
symbol
(モノクロの)シンボル文字。
text
アイコンにはテキスト的なフォールバックも必要である。これは視覚障害者に用いられることもあり得る。icon-preference
が(text)
だけの場合には、すべてのアイコンはテキストに置き換えられる。
アイコン仕様のリストの後にはさまざまなキーワードを続けることができる。たとえば:
(symbol "▶" "➤" :face icon-button)
不明なキーワードは無視される。以下のキーワードが使用できる:
:face
アイコンに使用するフェイス。
:height
image
アイコンにたいしてのみ有効。数値(ピクセル単位で高さを指定)、あるいはシンボルline
カレントで選択されているウィンドウのデフォルトの行高さを使用のいずれかを指定できる。
:width
image
アイコンにたいしてのみ有効。数値(ピクセル単位で幅を指定)、あるいはシンボルline
(カレントバッファーのデフォルトフェイスのフォントのピクセル幅を使用)のいずれかを指定できる。
docはドキュメント文字列であること。
keywordsはキーワード/値のペアーのリスト。以下のキーワードを指定できる:
:version
このボタンが最初に現れたEmacsの(おおよその)バージョン(このキーワードは必須)。
:group
このアイコンが所属するCustomizationグループ。未指定なら推測。
:help-echo
アイコン上にマウスポインターを置いた際に表示されるヘルプ文字列。
この関数はカレントバッファーでiconを表示する際に適切な文字列をリターンする。
あるいはこの関数によってiconの“分解された”バージョンを取得できる。この関数はキーがstring
、face
、imageであるようなplist(プロパティリストを参照)をリターンする(imageはアイコンがイメージとして表現される場合のみ与えられる)。これはアイコンをバッファーに直接挿入せずに、まず何らかの事前処理を行う必要があるとき有用かもしれない。
アイコンはM-x customize-iconでカスタマイズできます。たとえばテーマは以下のようにアイコンの変更を指定できます:
(custom-theme-set-icons 'my-theme '(outline-open ((image :height 100) (text " OPEN "))) '(outline-close ((image :height 100) (text " CLOSE " :face warning))))