xyzzy
Top Page > Tips > Menu


メニューバーのカスタマイズ

Reference
 →Written by YMTZ in favolite.l

新しいメニューを追加する場合

siteinit.l(追加)
(defun [メニュー名] ()
  (setq [変数]
    (define-popup-menu
      [メニューの中身]
      ))
      (insert-popup-menu *app-menu* (get-menu-position *app-menu* 'ed::[表示位置])
      [変数] "[メニュー名(&[キー])"))

      (add-hook '*init-app-menus-hook* #'[メニュー名])
[メニュー名]
 メニュー全体を表す関数です。最終的にフック変数にメニューを追加するために用いるものです(add-hookの部分)。半角英数。
[変数]
 メニューの構成を保持する変数です。後の方で「こういう内容のメニューをメニューバーに挿入する」ということを書くのに使います(insert-popup-menuの部分)。これも半角英数。
[表示位置]
 そのメニューを作る、メニューバー上の位置を示します。例えばwindowとすると「ウィンドウ(W)」の左隣に作られます。
[メニュー名(&[キー])]
 実際にドロップダウンメニューに表示される名前です。2バイト文字も使えます。(&)の中に書いたキーはショートカットキーになります(メニューで下線が引かれてるあれ)。
メニューの中身について
(:item [タグ] [メニュー名(&[キー])] '[関数 [表示設定]])

 メニュー項目です。

[タグ]
 メニュー項目を識別する任意のオブジェクトで、タグ同士はeqで比較されるとのことです(Reference)。ただ、評価する必要がないという話なので、少なくとも新しいメニューを追加する時はnilでいいのかも。
[メニュー名(&[キー])]
 実際にドロップダウンメニューに表示される名前です。上の方の「メニュー名」と同じ。
[関数](省略可)
 そのメニューを選択したときに実際に実行される関数です。関数名を指定してもよいですし、ここに直接処理内容を書くこともできます。
[表示設定](省略可)
 メニューが開く直前に評価され、返される値によってメニューの状態が設定されます。あまり無茶はしない方がいいそうです。意味のある値は以下のものがあります。これもReferenceから。
:modified
カレントバッファが変更されていなければ灰色表示(選択不可能)。
:undo
undo不可能であれば灰色表示。
:redo
redo不可能であれば灰色表示。
:selection
カレントバッファのテキストが未選択であるか矩形選択であれば灰色表示。
:rectangle
カレントバッファのテキストが未選択であるか矩形以外の選択であれば灰色表示。
:clipboard
クリップボードが空であれば灰色表示。
:check
チェック。
:disable
灰色表示。

 なお、ここで関数を指定することもできます。例えば、

siteinit.l (追加) Written by HIE
(defun check-init (&optional prog)
  (or (and (get-buffer-file-name *buffer-bar-context-menu-buffer*)
       (if prog (file-exist-p prog) t))
      :disable))

という関数を作っておいて、[表示設定]のところで'check-initと書くと、バッファにファイルが読み込まれていなかったら灰色表示になります(要するに「バッファにファイルがなかったら:disableとする」という関数)。

(:popup [タグ] [メニュー名(&[キー])] [メニューの中身])

 メニューを階層化するときの、グループの親に当たるもの(何て言うんだろう)を作成します。:itemと違って関数とかがありませんが、その他は:itemと同じです。また、[メニューの中身]も上の方で書いてるものと同じで、要するに:item:popup:sepが含まれます。

(:sep [タグ])
(:separator [タグ])

 セパレータです。[タグ]は省略できます。その場合は、(:sep)ではなく:sepと書いても構いません。

既存のメニューに追加する場合

siteinit.l(追加)
(add-hook '*init-app-menus-hook*
          #'(lambda ()
              (let (([追加する場所] (get-menu *app-menu* 'ed::[追加する場所])))
                  [メニューの中身]
                  )))
[追加する場所]
 どのメニューに追加するかを指定します。書式は新しいメニューを作る場合の「表示位置」と同じです。
メニューの中身について

 新規に作成する場合とは書式が違っています。

設定例

新しいメニューを作る場合

for example...
(defun browserex-menu ()
  (setq *browserex-menu-item*
    (define-popup-menu
      (:item nil "編集バッファにフォーカス(&E)" 'bx:browserex-set-focus-editor)
      (:item nil "ブラウザにフォーカス(&B)" 'bx:browserex-set-focus-browser)
      :sep
      (:popup nil "表示切り替え(&V)"
        (:item nil "ブラウザ窓の表示(&O)" 'bx:navigate-current-buffer)
        (:item nil "ブラウザ窓を閉じる(&C)" 'bx:close-browser)
        (:item nil "ブラウザ窓の位置(&P)" 'bx:rotate-browser)
      )
      :sep
      (:item nil "戻る(&,)" 'bx:go-back-browser)
      (:item nil "進む(&.)" 'bx:go-forward-browser)
    ))
  (insert-popup-menu *app-menu* (get-menu-position *app-menu* 'ed::window)
             *browserex-menu-item* "Browserex(&B)"))

(add-hook '*init-app-menus-hook* #'browserex-menu)

 browserex.l用のメニューを作ってみました。これでこんな感じのメニューになります。

Browserex(B)
  ・編集バッファにフォーカス(E)
  ・ブラウザにフォーカス(B)
  -----------------------------
  ・表示切り替え(V)
      ・ブラウザ窓の表示(O)
      ・ブラウザ窓を閉じる(C)
      ・ブラウザ窓の位置(P)
  -----------------------------
  ・戻る(,)
  ・進む(.)
▲トップページに戻る▲

メニューバー

Reference

新規

追加

設定例