Emacsでは通常、各フレームの上部にメニューバーが表示されます。The GNU Emacs Manualのメニューバーを参照してください。メニューバーの項目は、アクティブなキーマップで定義されている擬似関数キーMENU-BARのサブコマンドです。
メニューバーに項目を追加するには、独自の擬似関数キー(ここでは key
と呼びましょう)を考案し、キーシーケンス [menu-bar key]
にバインドを設定します。多くの場合、このバインドはメニューキーマップとなっており、メニューバー項目のボタンを押すと別のメニューが表示されるようになります。
複数のアクティブなキーマップがメニューバーの同一のファンクションキーを定義している場合、その項目は1つだけ表示されます。ユーザーがそのメニューバー項目をクリックすると、その項目のすべてのサブコマンド(グローバルサブコマンド、ローカルサブコマンド、およびマイナーモードサブコマンド)を含む、単一の統合メニューが表示されます。
メニューバーの内容を決定する際、変数 overriding-local-map
は通常無視されます。つまり、メニューバーは、overriding-local-map が nil であった場合に有効となるキーマップに基づいて算出されます。有効なキーマップを参照してください。
メニューバー項目の設定方法の例を以下に示します。
;; Make a menu keymap (with a prompt string) ;; and make it the menu bar item’s definition. (define-key global-map [menu-bar words] (cons "Words" (make-sparse-keymap "Words")))
;; Define specific subcommands in this menu.
(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’メニューバー項目に使用されます。グローバルメニューバー項目を抑制する主な理由は、モード固有の項目のためのスペースを確保することにあります。
通常、メニューバーにはグローバル項目が表示され、続いてローカルマップで定義された項目が表示されます。
この変数には、通常の順序ではなくメニューバーの末尾に表示するための擬似関数キーのリストが格納されています。デフォルト値は (help-menu) であり、したがってメニュー項目 ‘Help’ は通常、ローカルメニュー項目に続いてメニューバーの末尾に表示されます。
この通常のフックは、メニューバーを再表示する前に再表示処理を実行してメニューバーの内容を更新します。内容が変動するメニューの更新に利用できます。このフックは頻繁に実行されるため、呼び出される関数が通常のケースでそれほど時間を要しないようにしておくことを推奨します。
各メニューバー項目の横に、Emacsは同じコマンドを実行するキーバインド(存在する場合)を表示します。これは、キーバインドを知らないユーザーにとって便利なヒントとなります。コマンドに複数のバインドがある場合、Emacsは通常、最初に見つかったものを表示します。コマンドに:advertised-bindingシンボルプロパティを割り当てることで、特定のキーバインドを指定できます。ドキュメント内でのキーバインドの置換を参照してください。