Next: , Previous: , Up: Menu Keymaps   [Contents][Index]


23.17.5 メニューバー

Emacsは通常は各フレームの最上部にメニューバー(menu bar)を表示します。Menu Bars in The GNU Emacs Manualを参照してください。メニューバーのアイテムはアクティブキーマップ内で定義される偽りのファンクションキーMENU-BARのサブコマンドです。

メニューバーにアイテムを追加するには、自分で偽りのファンクションキー(これをkeyと呼ぶこととする)を創作して、キーシーケンス[menu-bar key]にたいするキーバインディングを作成します。ほとんどの場合において、そのバインディングはメニューキーマップなので、メニューバーアイテム上でボタンを押下すると他のメニューに導かれます。

メニューバーにたいして同じファンクションキーを定義するアクティブなキーマップが1つ以上存在するとき、そのアイテムは一度だけ出現します。ユーザーがメニューバーのそのアイテムをクリックすると、そのアイテムのすべてのサブコマンド、すなわちグローバルサブコマンド、ローカルサブコマンド、マイナーモードサブコマンドが組み合わされた単一のメニューを表示します。

変数overriding-local-mapは通常はメニューバーのコンテンツを決定する際は無視されます。つまりメニューバーはoverriding-local-mapnilの場合にアクティブになるであろうキーマップから計算されます。Active Keymapsを参照してください。

以下はメニューバーのアイテムをセットアップする例です:

;; (プロンプト文字列とともに)メニューキーマップを作成して
;; それをメニューバーアイテムの定義にする
(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’にたいしてグローバルキーマップが使用する偽ファンクションキーが生成するシンボルです。グローバルメニューバーアイテムを抑制する主な理由は、モード特有のアイテムのためのスペースを確保するためです。

Variable: menu-bar-final-items

メニューバーは通常はローカルマップで定義されるアイテムを終端にもつグローバルアイテムを表示する。

この変数は通常の順番による位置ではなく、メニューの最後に表示するアイテムのための偽ファンクションキーのリストを保持する。デフォルト値は(help-menu)。したがって‘Help’メニューアイテムはメニューバーの最後、ローカルメニューアイテムの後に表示される。

Variable: menu-bar-update-hook

このノーマルフックはメニューバーの再表示の前に、メニューバーのコンテンツ更新のための再表示によって実行される。コンテンツを変化させる必要があるメニューの更新に使用できる。このフックは頻繁に実行されるので、フックが呼び出す関数は通常は長い時間を要さないことを確実にするよう助言する。

Emacsはすべてのメニューバーアイテムの隣に、(もしそのようなキーバインディングが存在するなら)同じコマンドを実行するキーバインディングを表示します。これはキーバインディングを知らないユーザーにたいして有用なヒントを与える役目をもちます。コマンドが複数のバインディングをもつ場合、Emacsは通常は最初に見つけたバインディングを表示します。コマンドのシンボルプロパティ:advertised-bindingに割り当てることによって特定のキーバインディングを指定できます。Keys in Documentationを参照してください。