ツールバーとは、フレーム上部のメニューバーのすぐ下に配置された、クリック可能なアイコンの列のことです。The GNU Emacs ManualのTool Barsを参照してください。Emacsは通常、グラフィカルディスプレイ上でツールバーを表示します。
各フレームにおいて、フレームパラメータ tool-bar-lines
は、ツールバー用に何行分の高さを確保するかを制御します。値が 0 の場合、ツールバーは非表示になります。値が 0 以外で、かつ auto-resize-tool-bars が nil
以外の場合、ツールバーは指定された内容を保持できるよう、必要に応じて自動的に拡大・縮小します。値が grow-only の場合、ツールバーは自動的に拡大しますが、自動的に縮小することはありません。
ツールバーの内容は、TOOL-BAR
という擬似関数キーに割り当てられたメニューキーマップによって制御されます(メニューバーの制御方法と同様です)。そこで、define-key を使用して、次のようにツールバー項目を定義します。
(define-key global-map [tool-bar key] item)
ここで、key はこの項目を他の項目と区別するための擬似関数キーであり、item はメニュー項目のキーバインド(拡張メニュー項目を参照)で、この項目をどのように表示し、どのように動作させるかを規定します。
通常のメニューキーマップ項目プロパティである :visible、:enable、:button、および :filter は、ツールバーのバインドに有用であり、通常の意味を持ちます。項目内の real-binding
はキーマップではなくコマンドである必要があります。言い換えれば、ツールバーアイコンをプレフィックスキーとして定義することはできません。
:help
プロパティは、マウスがそのアイテム上にある間に表示されるヘルプエコー文字列を指定します。これは help-echo テキストプロパティと同様に表示されます(ヘルプ表示 を参照)。
さらに、:image
プロパティを使用してください。ツールバーに表示する画像を指定するには、次のように記述します。
:image imageimage は、単一の画像指定(Images を参照)、または 4 つの画像指定からなるベクトルのいずれかです。4 つの画像指定からなるベクトルを使用する場合、状況に応じてそのうちの 1 つが使用されます:
アイテムが有効かつ選択されている場合に使用されます。
アイテムが有効で、選択が解除されている場合に使用されます。
アイテムが無効で選択されている場合に使用されます。
アイテムが無効で選択解除されている場合に使用されます。
EmacsのGTK+版およびNS版では、無効または選択解除された画像が項目0から自動計算されるため、項目1~3は無視されます。
image が単一の画像指定である場合、Emacs は画像にエッジ検出アルゴリズムを適用することで、ツールバーボタンを無効な状態で描画します。
:rtl プロパティは、右から左へ書く言語で使用する代替画像を指定します。現時点では、Emacs の
GTK+ 版のみがこれをサポートしています。
ツールキットによっては、ツールバーに画像とテキストの両方を表示するものがあります。画像のみを強制的に使用したい場合は、nil 以外のプロパティである :vert-only
を使用してください。
メニューバーと同様に、ツールバーにも区切り線を表示できます(メニューの区切り線を参照)。ただし、ツールバーの区切り線は水平ではなく垂直であり、サポートされているスタイルは1種類のみです。ツールバーのキーマップでは(menu-item "--")エントリとして表現され、:visibleのようなプロパティはツールバーの区切り線ではサポートされていません。区切り線はGTK+およびNextstepのツールバーではネイティブに描画され、それ以外の場合は垂直線の画像を用いて描画されます。
デフォルトのツールバーは、コマンドシンボルの mode-class プロパティが special であるメジャーモードにおいて、編集専用の項目が表示されないように定義されています(メジャーモードの規約を参照)。メジャーモードは、ローカルマップで
[tool-bar foo]
をバインドすることで、グローバルバーに項目を追加できます。デフォルトのツールバー項目をすべて置き換える方が合理的なメジャーモードもあります。というのも、便利に配置できる項目は多くなく、デフォルトのバインディングでは
tool-bar-map を介した間接参照を用いることでこれが容易に実現できるためです。
デフォルトでは、グローバルマップは [tool-bar] を次のようにバインドします。
(keymap-global-set "<tool-bar>"
'(menu-item "tool bar" ignore
:filter tool-bar-make-keymap))
関数 tool-bar-make-keymap は、さらに変数 tool-bar-map
の値から実際のツールバーマップを動的に導出します。したがって、通常はこのマップを変更することで、デフォルト(グローバル)ツールバーを調整します。Infoモードなどの一部の主要なモードでは、tool-bar-map
をバッファローカルにして別のキーマップに設定することで、グローバルツールバーを完全に置き換えます。
ツールバー項目を定義するための便利な関数が、以下のように2つあります。
この関数は、tool-bar-map を変更することでツールバーに項目を追加します。使用する画像は
icon で定義され、これは find-image
で指定される XPM、XBM、または PBM 画像ファイルのベース名となります。例えば ‘"exit"’ という値が指定された場合、カラーディスプレイでは exit.xpm、exit.pbm、exit.xbm の順に検索が行われます。モノクロディスプレイでは、検索順は ‘.pbm’、‘.xbm’、‘.xpm’
となります。使用するバインディングはコマンド def であり、key はプレフィックスキーマップにおける擬似関数キーシンボルです。残りの引数 props は、メニュー項目の仕様に追加する追加のプロパティリスト要素です。
ローカルマップで項目を定義するには、この関数の呼び出し箇所で tool-bar-map を
let にバインドしてください:
(defvar foo-tool-bar-map
(let ((tool-bar-map (make-sparse-keymap)))
(tool-bar-add-item ...)
...
tool-bar-map))
この関数は、既存のメニューバーのバインディングと整合性の取れたツールバー項目を定義するための便利な関数です。command のバインディングは、メニューバーの map(デフォルトは global-map)で参照され、tool-bar-add-item と同様の方法で特定される icon 用の画像指定を追加するように修正されます。その後、得られたバインディングが tool-bar-map に配置されるため、この関数はグローバルツールバー項目にのみ使用してください。
map には、[menu-bar]
にバインドされた適切なキーマップを含める必要があります。残りの引数 props
は、メニュー項目の仕様に追加する追加のプロパティリスト要素です。
この関数は、グローバルではないツールバー項目を作成するために使用します。tool-bar-add-item-from-menuと同様に使用しますが、in-mapで定義を行うローカルマップを指定します。引数from-mapは、tool-bar-add-item-from-menuのmap引数と同様の役割を果たします。
tool-bar-mapで定義されたツールバー項目に加え、Emacsではキーマップsecondary-tool-bar-mapで指定された「セカンダリ」ツールバー項目をさらに1行表示することも可能です。これらの項目は、ツールバーがフレームの上部に配置されている場合は通常tool-bar-map内で定義された項目の下に表示されますが、下部に配置されている場合はそれらの上に表示されます(レイアウトパラメータを参照)。ツールバーがフレームの左側または右側に配置されている場合は、表示されません。
この変数が nil
以外の場合、ツールバーは自動的にリサイズされ、定義済みのすべてのツールバー項目が表示されます—ただし、フレームの高さの4分の1を超えることはありません。’
値が grow-only
の場合、ツールバーは自動的に展開されますが、自動的に折りたたまれることはありません。ツールバーを折りたたむには、ユーザーが C-l を入力してフレームを再描画する必要があります。
EmacsをGTK+またはNextstepでビルドした場合、ツールバーには1行しか表示できないため、この変数は効果がありません。
この変数がnil以外の場合、マウスカーソルを合わせたときにツールバーの項目が浮き上がって表示されます。
この変数は、ツールバーの項目の周囲に追加する余白を指定します。値はピクセル単位の整数です。デフォルトは4です。
この変数は、ツールバー項目のシャドウ幅を指定します。値はピクセル単位の整数です。デフォルトは1です。
この変数は、ツールバー領域の下に描画される枠線の高さを指定します。高さはピクセル数で整数として指定します。値が internal-border-width(デフォルト)または border-width のいずれかである場合、ツールバーの枠線の高さは対応するフレームパラメータに従います。
Shift、Control、Metaなどの修飾キーを押しながらツールバーの項目をクリックした際に、特別な動作を定義できます。これは、擬似ファンクションキーを介して元の項目に関連する追加項目を設定することで実現します。具体的には、追加項目には、元の項目の命名に使用したのと同じ擬似ファンクションキーの修飾版を使用する必要があります。
したがって、元の項目がこのように定義されていた場合、
(define-key global-map [tool-bar shell]
'(menu-item "Shell" shell
:image (image :type xpm :file "shell.xpm")))
それでは、Shiftキーを押しながら同じツールバーの画像をクリックする操作を定義する方法を以下に示します。
(define-key global-map [tool-bar S-shell] 'some-command)
ファンクションキーに修飾キーを追加する方法の詳細については、ファンクションキーを参照してください。
ツールバー項目の有効・無効を切り替える関数がある場合、この状態が必ずしも即座に視覚的に反映されるとは限りません。ツールバーの再計算を強制するには、force-mode-line-update を呼び出してください(モードライン形式を参照)。