次: Modifying Menus, 前: Menu Example, 上: Menu Keymaps
ほとんどのウィンドウシステムでは、
各フレームにメニューバー(menu bar)、
つまり、フレームの先頭に水平方向に延びているメニューを恒久的に表示できます。
メニューバーの項目は、すべての活性なキーマップで定義された
疑似『ファンクションキー』menu-barのサブコマンドです。
メニューバーに項目を追加するには、
読者独自の疑似『ファンクションキー』を考え(これをkeyとする)、
キー列[menu-bar key]に対するバインディングを作ります。
多くの場合、バインディングはメニューキーマップであって、
メニューバーの項目上でボタンを押すと別のメニューへ至るようにします。
メニューバーに対する同じ疑似ファンクションキーを 複数の活性なキーマップで定義していても、1つの項目だけが表示されます。 ユーザーがメニューバーの当該項目をクリックすると、 当該項目のすべてのサブコマンド、つまり、 グローバルのサブコマンド、ローカルのサブコマンド、 マイナモードのサブコマンドを含む1つの複合メニューが表示されます。
メニューバーの内容を決定する際には、
通常、変数overriding-local-mapは無視されます。
つまり、overriding-local-mapがnilであるときに
活性になるキーマップからメニューバーを計算します。
See Active Keymaps。
フレームにメニューバーを表示するには、
フレームのパラメータmenu-bar-linesが0より大きい必要があります。
Emacsはメニューバーそのものには1行だけ使います。
読者が2行以上を指定すると、
残りの行はフレームのウィンドウとメニューバーを区切る行になります。
menu-bar-linesの値には1か2を勧めます。
See Window Frame Parameters。
メニューバーの項目の設定例を示します。
(modify-frame-parameters (selected-frame)
'((menu-bar-lines . 2)))
;; (プロンプト文字列を持つ)メニューキーマップを作り
;; それをメニューバーの項目の定義にする
(define-key global-map [menu-bar words]
(cons "Words" (make-sparse-keymap "Words")))
;; このメニュー内のサブコマンドを定義する
(define-key global-map
[menu-bar words forward]
'("Forward word" . forward-word))
(define-key global-map
[menu-bar words backward]
'("Backward word" . backward-word))
グローバルキーマップに作ったメニューバー項目を
ローカルキーマップで取り消すには、
ローカルキーマップの当該疑似ファンクションキーのバインディングを
undefinedで再バインドします。
たとえば、つぎのようにしてdiredはメニューバーの項目`Edit'を抑制します。
(define-key dired-mode-map [menu-bar edit] 'undefined)
editは、メニューバー項目`Edit'に対して
グローバルキーマップで使う疑似ファンクションキーです。
グローバルなメニューバー項目を抑制する主な理由は、
モード固有の項目向けに場所を確保するためです。