拡張形式のメニュー項目は、シンプル形式に比べて柔軟性が高く、よりすっきりとした代替手段となります。イベントタイプは、シンボル menu-item
で始まるリスト形式のバインディングで定義します。選択不可の文字列の場合、バインディングは次のようになります。
(menu-item item-name)
2つ以上のハイフンで始まる文字列は区切り線を指定します。メニューの区切り線を参照してください。
選択可能な実際のメニュー項目を定義する場合、拡張フォーマットバインディングは次のようになります。
(menu-item item-name real-binding
. item-property-list)
ここで、item-name はメニュー項目の文字列として評価される式です。したがって、その文字列は定数である必要はありません。
3番目の要素 real-binding
は、実行するコマンドを指定できます(この場合、通常のメニュー項目になります)。また、キーマップを指定することもでき、その場合はサブメニューとなり、item-name がサブメニュー名として使用されます。最後に、nil
を指定することもでき、この場合は選択不能なメニュー項目になります。これは主に区切り線などを作成する際に有用です。
リストの末尾にある item-property-list は、他の情報を含むプロパティリスト(プロパティリスト を参照)の形式をしています。
サポートされているプロパティの一覧は以下の通りです。
:enable formform を評価した結果によって、その項目が有効かどうかが決まります(nil 以外の場合は有効です)。項目が有効でない場合、実際にはクリックできません。
:visible formform を評価した結果によって、その項目を実際にメニューに表示するかどうかが決定されます(nil
以外の場合は表示されます)。項目が表示されない場合は、その項目が一切定義されていないかのようにメニューが表示されます。
:help helpこのプロパティ help
の値は、マウスがそのアイテム上にある間に表示されるヘルプエコー文字列を指定します。これは help-echo のテキストプロパティと同様に表示されます(ヘルプ表示 を参照)。なお、テキストやオーバーレイ用の
help-echo プロパティとは異なり、これは定数文字列である必要があります。
:button (type . selected)このプロパティでは、ラジオボタンやトグルボタンを定義できます。CAR, type は、どちらであるか(:toggle か :radio か)を示します。CDR, selected
はフォームである必要があり、それを評価した結果によって、このボタンが現在選択されているかどうかが分かります。
A toggle is a menu item which is labeled as either on
or off according to the value of selected. The
command itself should toggle selected, setting it to
t if it is nil, and to
nil if it is t. Here is
how the menu item to toggle the debug-on-error
flag is defined:
(menu-item "Debug on Error" toggle-debug-on-error
:button (:toggle
. (and (boundp 'debug-on-error)
debug-on-error)))
これは、toggle-debug-on-error が変数 debug-on-error を切り替えるコマンドとして定義されているためです。
ラジオボタンはメニュー項目のグループであり、任意の時点でただ1つだけが選択されます。どの項目が選択されているかを示す値を持つ変数を用意する必要があります。グループ内の各ラジオボタンのselectedフォームでは、その変数がそのボタンを選択するための正しい値を持っているかを確認する必要があります。ボタンをクリックすると、クリックしたボタンが選択されるように変数が設定される必要があります。
:key-sequence key-sequenceこのプロパティは、キーボード相当として表示するキーシーケンスを指定します。Emacsはメニューにkey-sequenceを表示する前に、key-sequenceが実際にこのメニュー項目と同等であるかを確認するため、正しいキーシーケンスを指定した場合にのみ効果が現れます。key-sequenceにnilを指定することは、:key-sequence属性が存在しないことと同等です。
:keys stringこのプロパティは、string がこのメニュー項目のキーボード相当として表示される文字列であることを指定します。string では ‘\\[...]’ ドキュメント構文を使用できます。
このプロパティには関数を指定することもできます(この場合、引数なしで呼び出されます)。この関数は文字列を返す必要があります。この関数はメニューが計算されるたびに呼び出されるため、計算に時間を要する関数を使用するのは得策ではなく、また、あらゆるコンテキストから呼び出されることを想定して設計する必要があります。
:filter filter-fnこのプロパティを使用すると、メニュー項目を動的に計算できます。プロパティ値 filter-fn は1つの引数を取る関数である必要があり、呼び出された際の引数は real-binding となります。この関数は、代わりに使用すべきバインディングを返す必要があります。
Emacsは、再表示を行う際やメニューのデータ構造を操作する際にいつでもこの関数を呼び出すことができるため、いつでも安全に呼び出せるように記述してください。
:wrap wrap-pツールバー内で wrap-p が nil
以外の場合、メニュー項目は表示されず、代わりに後続の項目が改行して表示されます。これは、Emacs が GTK+ または Nextstep
ツールキットを使用している場合にはサポートされていません。