Next: , Previous: Menu Example, Up: Menu Keymaps


21.12.5 メニューバー

ほとんどのウィンドウシステムでは、 各フレームにメニューバー(menu bar)、 つまり、フレームの先頭に水平方向に延びているメニューを恒久的に表示できます。 メニューバーの項目は、すべての活性なキーマップで定義された 疑似『ファンクションキー』menu-barのサブコマンドです。

メニューバーに項目を追加するには、 読者独自の疑似『ファンクションキー』を考え(これをkeyとする)、 キー列[menu-bar key]に対するバインディングを作ります。 多くの場合、バインディングはメニューキーマップであって、 メニューバーの項目上でボタンを押すと別のメニューへ至るようにします。

メニューバーに対する同じ疑似ファンクションキーを 複数の活性なキーマップで定義していても、1つの項目だけが表示されます。 ユーザーがメニューバーの当該項目をクリックすると、 当該項目のすべてのサブコマンド、つまり、 グローバルのサブコマンド、ローカルのサブコマンド、 マイナモードのサブコマンドを含む1つの複合メニューが表示されます。

メニューバーの内容を決定する際には、 通常、変数overriding-local-mapは無視されます。 つまり、overriding-local-mapnilであるときに 活性になるキーマップからメニューバーを計算します。 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’に対して グローバルキーマップで使う疑似ファンクションキーです。 グローバルなメニューバー項目を抑制する主な理由は、 モード固有の項目向けに場所を確保するためです。

— Variable: menu-bar-final-items

通常、メニューバーは、グローバルな項目に ローカルキーマップで定義された項目を続けて表示する。

この変数は、通常の順ではなくメニューバーの底に表示する項目に 対する疑似ファンクションキーのリストを保持する。 デフォルト値は(help-menu)であり、 したがって、ローカルのメニュー項目に続いて、 メニュー項目‘Help’はメニューバーの最後に通常表示される。

— Variable: menu-bar-update-hook

このノーマルフックは、 ユーザーがメニューバーをクリックするたびに、 サブメニューを表示するまえに実行される。 これを用いて、内容が変化するサブメニューを更新できる。