Emacsでは、ボタン(クリック用)や小さなグラフィック(何かを説明するためのもの)が使われることがあります。Emacsは機能の異なる多種多様なシステムで利用可能であり、ユーザーによって好みも異なるため、カスタマイズ、グレースフルデグラデーション、アクセシビリティ、そしてユーザビリティを可能にする、これらを便利に扱うための仕組みとしてアイコンが用意されています。
ここでの中心的なマクロは 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
の値(The GNU Emacs Manual の Icons
を参照)と、現在のフレームのターミナルで実際に何が表示可能かに関する実行時チェックの結果によって決まります。
上記の例のマクロでは、outline-open をアイコンとして定義し、button
というアイコンからプロパティを継承しています(つまり、これはバッファに挿入されるクリック可能なボタンとして意図されています)。続いて、アイコンタイプの一覧と、実際のアイコン形状が記述されています。さらに、追加情報やプロパティを含むドキュメント文字列や、さまざまなキーワードが記載されています。
アイコンをインスタンス化するには icon-string を使用します。これにより、現在の
Customize テーマ、ユーザーオプションの icon-preference、そして最終的に
Emacs が実際に表示可能かどうかが参照されます。もし icon-preference が
(image emoji symbol
text)(つまり、これらすべての形式のアイコンを許可している)場合、このケースでは icon-string はまず Emacs
がそもそも画像を表示可能かどうかを確認し、次にそれらの異なる画像フォーマットそれぞれをサポートしているかを確認します。それが失敗した場合、Emacs
は(現在のフレームで)絵文字を表示できるかを確認します。それも失敗した場合は、該当するシンボルを表示できるかを確認します。それでも失敗した場合は、プレーンテキスト版が使用されます。
例えば、icon-preferenceにimageやemojiが含まれていない場合、それらのエントリはスキップされます。
コードはあらゆる状況において安心して icon-string
を呼び出すことができ、ユーザーがグラフィカル端末かテキスト端末か、あるいは Emacs
がどのような機能を備えてビルドされたかにかかわらず、画面上に読み取り可能な内容が表示されることを確信できます。
アイコン name(シンボル)を定義し、spec
に表示バリエーションを、icon-string で後からインスタンス化できるようにします。name は、結果として得られるキーワードの名称です。
生成されるアイコンは、parent、さらにその親の親……といった順に仕様を継承し、最も下位にある子孫要素が優先されます。
specs はアイコン仕様のリストです。各仕様の最初の要素はタイプであり、それ以降はそのタイプのアイコンとして使用可能なもの、続いて任意でキーワードリストが記述されます。利用可能なアイコンタイプは以下の通りです。
imageこの場合、候補として多くの画像がリストアップされることがあります。Emacsは、現在のEmacsインスタンスで表示可能な最初の画像を選択します。画像が絶対ファイル名で指定されている場合はそのまま使用されますが、それ以外の場合はリスト
image-load-path から検索されます(画像の定義を参照)。
emojiこれは(もしかしたらカラフルな)絵文字であるべきです。
symbolこれは(モノクロの)記号文字であるべきです。
textアイコンにはテキストによるフォールバックも用意すべきです。これは視覚障害者にとっても有用です。icon-preference が単に (text)
である場合、すべてのアイコンがテキストに置き換えられます。
アイコン仕様の一覧の後に、さまざまなキーワードが続く場合があります。例えば:
(symbol "▶" "➤" :face icon-button)
不明なキーワードは無視されます。以下のキーワードが使用可能です:
:faceアイコンに使用する顔。
:heightThis is only valid for image icons, and can be
either a number (which specifies the height in pixels), or the symbol line, which will use the default line height in the
currently selected window.
:widthこれは image アイコンにのみ有効で、数値(ピクセル単位の幅を指定)または記号 font
のいずれかを指定できます。後者の場合は、現在のバッファのデフォルトフェイスフォントのピクセル単位の幅が使用されます。
doc はドキュメント文字列である必要があります。
keywords はキーワードと値のペアのリストです。以下のキーワードが使用可能です:
:versionこのボタンが最初に登場した(おおよその)Emacsのバージョン。(このキーワードは必須です。)
:groupこのアイコンが属するカスタマイズグループ。存在しない場合は推論されます。
:help-echoアイコンにマウスポインタを合わせた際に表示されるヘルプ文字列。
この関数は、icon の現在のバッファに表示するのに適した文字列を返します。
あるいは、この関数を使用して icon
の「分解済み」バージョンを取得することもできます。この関数は、キーが string、face、image である plist(プロパティリスト
を参照)を返します。(後者は、アイコンが画像で表現されている場合にのみ存在します。)これは、アイコンをバッファに直接挿入するのではなく、あらかじめ何らかの前処理が必要な場合に有用です。
アイコンは 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))))