メニューアイテムの拡張フォーマットは、単純なフォーマットに比べてより柔軟かつ明快です。拡張フォーマットではシンボル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 form
formの評価結果はそのアイテムを有効にするかどうかを決定する(非nil
なら有効)。アイテムが無効なら▽まったくクリックできない。
:visible form
formの評価結果はそのアイテムを実際にメニューに表示するかどうかを決定する(非nil
なら表示)。アイテムが非表示ならそのアイテムが定義されていないかのようにメニューが表示される。
:help help
このプロパティhelpの値はそのアイテム上にマウスがある間に表示するhelp-echo文字列を指定する。この文字列はhelp-echo
テキストプロパティ(Help displayを参照)と同じ方法で表示される。これはテキストやoverlayにたいするhelp-echo
プロパティとは異なり、文字列定数でなければならないことに注意。
:button (type . selected)
このプロパティはラジオボタンとトグルボタンを定義する手段を提供する。CARのtypeには、:toggle
か:radio
のいずれかを指定する。CDRのselectedはフォームで、評価結果によってそのボタンがカレントで選択されているかどうかを指定する。
トグル(toggle)はselectedの値に応じてonかoffのいずれかがラベルされるメニューアイテムである。コマンド自身はselectedがnil
ならt
、t
ならnil
にselectedを切り替える(toggleする)こと。以下はdebug-on-error
フラグが定義されているときにメニューアイテムをトグルする方法の例:
(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)。そのためにはどのメニューアイテムが選択されているかを示す変数が存在する必要がある。グループ内の各ラジオボタンにたいする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
であればメニューアイテムは表示されないが、後続のアイテムが新たな行に表示される。これはlEmacsがGTK+とNextstepツールキットを使用しているとサポートされない。