メニュー項目を定義するよりシンプルで(かつ本来的な)方法は、何らかのイベントタイプ(どのイベントタイプでも構いません)を、次のようなバインディングに紐付けることです:
(item-string . real-binding)
CAR, item-string, はメニューに表示される文字列です。短く、できれば1〜3語程度にしてください。対応するコマンドの動作を説明する内容にする必要があります。なお、すべてのグラフィカルツールキットがメニュー内で非ASCIIテキストを表示できるわけではありません(キーボードメニューでは動作し、GTK+ツールキットでも概ね動作します)。
また、ヘルプ文字列と呼ばれる2つ目の文字列を、次のように指定することもできます。
(item-string help . real-binding)
help は、help-echo
テキストプロパティと同様に、マウスがその項目上にある間に表示されるヘルプエコー文字列を指定します(ヘルプ表示を参照)。
define-keyに関しては、item-stringとhelp-stringはイベントのバインディングの一部となります。ただし、lookup-keyはreal-bindingのみを返し、キーの実行に使用されるのはreal-bindingのみです。
real-bindingがnilの場合、item-stringはメニューに表示されますが、選択できません。
real-binding がシンボルであり、かつ nil 以外の menu-enable
プロパティを持つ場合、そのプロパティはメニュー項目の有効・無効を制御する式となります。キーマップを用いてメニューを表示するたびに Emacs
はこの式を評価し、式の値が nil
以外である場合にのみメニュー項目を有効にします。メニュー項目が無効な状態では、ぼやけた状態で表示され、選択することはできません。
メニューバーは、メニューを確認するたびにどの項目が有効になっているかを再計算するわけではありません。これは、Xツールキットがメニューのツリー全体を事前に必要とするためです。メニューバーの再計算を強制するには、force-mode-line-updateを呼び出してください(モードライン形式を参照)。