次: , 前: Keyboard Menus, 上: Menu Keymaps


21.12.4 メニューの例

以下に、メニューキーマップの完全な定義の例を示します。 これは、メニューバーのメニュー`Tools'の サブメニュー`Print'の定義であり、 単純なメニュー項目を使います (see Simple Menu Items)。 まず、キーマップを作成し名前を与えます。

     (defvar menu-bar-print-menu (make-sparse-keymap "Print"))

つぎに、メニュー項目を定義します。

     (define-key menu-bar-print-menu [ps-print-region]
       '("Postscript Print Region" . ps-print-region-with-faces))
     (define-key menu-bar-print-menu [ps-print-buffer]
       '("Postscript Print Buffer" . ps-print-buffer-with-faces))
     (define-key menu-bar-print-menu [separator-ps-print]
       '("--"))
     (define-key menu-bar-print-menu [print-region]
       '("Print Region" . print-region))
     (define-key menu-bar-print-menu [print-buffer]
       '("Print Buffer" . print-buffer))

バインディングが『作られる対象』のシンボルに注意してください。 定義されるキー列の角括弧の内側に現れています。 そのシンボルはコマンド名に等しい場合もあればそうでない場合もあります。 これらのシンボルは『ファンクションキー』として扱われますが、 キーボード上の本物のファンクションキーではありません。 それらはメニュー項目の機能には影響ありませんが、 ユーザーがメニューから選ぶとそれらはエコー領域に『表示』され、 where-isaproposの出力にも現れます。

定義が("--")であるようなバインディングは区切り行です。 実際のメニュー項目のように、区切りにもキーシンボルがあり、 例ではseparator-ps-printです。 1つのメニューに複数の区切りがある場合、 それらはすべて異なるキーシンボルでなければなりません。

つぎには、メニュー内の2つのコマンドのオン条件を定義するコードです。

     (put 'print-region 'menu-enable 'mark-active)
     (put 'ps-print-region-with-faces 'menu-enable 'mark-active)

つぎは、このメニューを親メニューの項目に現れるようにする方法です。

     (define-key menu-bar-tools-menu [print]
       (cons "Print" menu-bar-print-menu))

ここで使っているのは、サブメニューのキーマップ、つまり、 変数menu-bar-print-menuの値であって、 変数そのものではないことに注意してください。 menu-bar-print-menuはコマンドではないので、 このシンボルを親メニューの項目に使っても意味がありません。

同じ印刷メニューをマウスクリックに対応付けたければ、 つぎのようにしてできます。

     (define-key global-map [C-S-down-mouse-1]
        menu-bar-print-menu)

つぎのようにして、print-regionに対して拡張メニュー項目 (see Extended Menu Items)を使うこともできます。

     (define-key menu-bar-print-menu [print-region]
       '(menu-item "Print Region" print-region
                   :enable (mark-active)))

拡張メニュー項目では、オン条件はメニュー項目自体の内側に指定します。 マークがないときにはメニューからこの項目が消えるようにするには つぎのようにします。

     (define-key menu-bar-print-menu [print-region]
       '(menu-item "Print Region" print-region
                   :visible (mark-active)))