ツールバー(tool bar)とはフレームの最上部、メニューバー直下にあるクリック可能なアイコンの行のことです。Tool Bars in The GNU Emacs Manualを参照してください。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文字列を指定します。これはテキストプロパティhelp-echo
と同じ方法で表示されます(Help displayを参照)。
これらに加えて:image
プロパティも使用するべきでしょう。ツールバー内にイメージを表示するにはこのプロパティを使用します。
:image image
imageは単一イメージ様式(single image specification)か4ベクターイメージ様式(vector of four image specifications)で指定する(イメージを参照)。4ベクターを使用する場合には状況に応じて以下のいずれかが使用される:
アイテムが有効かつ選択されているときに使用。
アイテムが有効かつ未選択のときに使用。
アイテムが無効かつ選択されているときに使用。
アイテムが無効かつ未選択のときに使用。
GTK+バージョンとNSバージョンのEmacsは、無効および/または未選択のイメージをitem0から自動的に計算するので、item1からitem3は無視されます。
imageが単一イメージ様式なあ、Emacsはそのイメージにエッジ検出アルゴリズム(edge-detection algorithm)を適用することによってツールバーの無効な状態のボタンを描画します。
:rtl
プロパティには右から左に記述する言語のためのイメージ候補を指定します。これをサポートするのは現在のところGTK+バージョンのEmacsだけです。
メニューバーと同様、ツールバーはセパレーター(メニューセパレーターを参照)を表示できます。ツールバーのセパレーターは水平ラインではなく垂直ラインであり、1つのスタイルだけがサポートされます。これらはツールバーキーマップ内では(menu-item
"--")
エントリーで表されます。ツールバーのセパレーターでは、:visible
のようなプロパティはサポートされません。GTK+とNextstepのツールバーでは、セパレーターはネイティブに描画されます。それ以外ではセパレーターは垂直ラインイメージを使用して描画されます。
デフォルトツールバーはコマンドシンボルのmode-class
プロパティにspecial
をもつメジャーモードにたいしては、編集に特化したアイテムは表示しないよう定義されています(メジャーモードの慣習を参照)。メジャーモードは、ローカルマップ内でバインディング[tool-bar
foo]
によって、グローバルバーにアイテムを追加するかもしれません。デフォルトツールバーの多くを適宜流用するのができないかもしれないので、デフォルトツールバーを完全に置き換えることは、いくつかのメジャーモードにとっては有意義です。デフォルトバインディングでtool-bar-map
を通じてインダイレクトすることにより、これを簡単に行うことができます。
デフォルトではグローバルマップは[tool-bar]
を以下のようにバインドする:
(global-set-key [tool-bar] `(menu-item ,(purecopy "tool bar") ignore :filter tool-bar-make-keymap))
関数tool-bar-make-keymap
は、変数tool-bar-map
の値より順番に実際のツールバーマップをダイナミックに継承する。したがって通常はそのマップを変更することにより、デフォルト(グローバル)ツールバーを調整すること。Infoモードのようないくつかのメジャーモードは、tool-bar-map
をバッファーローカルにして、それに異なるキーマップをセットすることによりグローバルツールバーを完全に置き換える。
以下のようなツールバーアイテムを定義するのに便利な関数があります。
この関数はtool-bar-map
を変更することにより、ツールバーにアイテムを追加する。使用するイメージはiconにより定義され、これはfind-image
に配置されたXPM、XBM、PBMのイメージファイルの拡張子を除いたファイル名(basename)である。たとえばカラーディスプレイ上では、値に‘"exit"’を与えるとexit.xpm、exit.pbm、exit.xbmの順に検索されるだろう。モノクロディスプレイでは検索は‘.pbm’、‘.xbm’、‘.xpm’の順になる。使用するバインディングはコマンドdefで、keyはプレフィクスキーマップ内の偽ファンクションキーである。残りの引数propsはメニューアイテム仕様に追加する追加のプロパティリスト要素である。
あるローカルマップ内にアイテムを定義するためには、この関数呼び出しの周囲のlet
でtool-bar-map
をバインドする:
(defvar foo-tool-bar-map (let ((tool-bar-map (make-sparse-keymap))) (tool-bar-add-item …) … tool-bar-map))
この関数は既存のメニューバインディングと矛盾しないツールバーアイテムの定義に有用。commandのバインディングはmap(デフォルトはglobal-map
)内よりルックアップ(lookup:
照合)され、iconにたいするイメージ仕様はtool-bar-add-item
と同じ方法で見つけ出される。結果のバインディングはtool-bar-map
に配置されるので、この関数の使用はグローバルツールバーアイテムに限定される。
mapには[menu-bar]
にバインドされた適切なキーマップが含まれていなければならない。残りの引数propsはメニューアイテム仕様に追加する追加のプロパティリスト要素。
この関数は非グローバルツールバーアイテムの作成に使用される。in-mapに定義を作成するローカルマップを指定する以外はtool-bar-add-item-from-menu
と同じように使用する。引数from-mapはtool-bar-add-item-from-menu
のmapと同様。
この変数が非nil
なら定義されたすべてのツールバーアイテムを表示するためにツールバーは自動的にリサイズされるが、そのフレーム高さの1/4を超えてリサイズされることはない。
値がgrow-only
ならツールバーは自動的に拡張されるが縮小はされない。ツールバーを縮小するためにユーザーはC-lをエンターしてフレームを再描画する必要がある。
GTK+やNextstepとともにEmacsがビルドされた場合には、ツールバーが表示できるのは1行だけであり、この変数は効果がない。
この変数が非nil
ならツールバーアイテム上をマウスが通過したとき、浮き上がった形式(raised form)で表示される。
この変数はツールバーアイテムの周囲に追加する余白(extra margin)を指定する。値はピクセル数を整数で指定する。デフォルトは4。
この変数はツールバーアイテムの影(shadow)を指定する。値はピクセル数を整数で指定する。デフォルトは1。
この変数はツールバーエリアの下に描画するボーダー高さを指定する。値が整数なら高さのピクセル数。値がinternal-border-width
(デフォルト)かborder-width
のいずれかなら、ツールバーのボーダー高さはそのフレームの対応するパラメーターとなる。
シフトやメタ等の修飾キーを押下した状態でのツールバーアイテムのクリックに特別な意味を付与できます。偽りのファンクションキーを通じて元のアイテムに関連する追加アイテムをセットアップすることによって、これを行うことができます。より具体的には追加アイテムは、元のアイテムの命名に使用されたのと同じ偽ファンクションキーの修飾されたバージョンを使用するべきです。
つまり元のアイテムが以下のように定義されていれば、
(define-key global-map [tool-bar shell] '(menu-item "Shell" shell :image (image :type xpm :file "shell.xpm")))
シフト修飾とともに同じツールバーイメージをクリックしたときを以下のような方法で定義することができます:
(define-key global-map [tool-bar S-shell] 'some-command)
ファンクションキーに修飾を追加する方法についての詳細な情報は、ファンクションキーを参照してください。
ツールバーアイテムを有効または無効に変更する関数があるとしても、その状態を必ずしも視覚的に即座に更新される訳ではありません。ツールバーの再計算を強制するにはforce-mode-line-update
を呼び出してください(モードラインのフォーマットを参照)。