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アイコンに使用するフェイス。
:heightimageアイコンにたいしてのみ有効。数値(ピクセル単位で高さを指定)、あるいはシンボルline
カレントで選択されているウィンドウのデフォルトの行高さを使用のいずれかを指定できる。
:widthimageアイコンにたいしてのみ有効。数値(ピクセル単位で幅を指定)、あるいはシンボル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))))