9

私は、emacs 用の独自のマイナー モードを作成しています。今、モードラインにボタンを追加したいと思います。このボタンをクリックすると、ポップアップ メニューが表示されます。このメニューの項目は、ユーザーのアクションに依存します。「minor-mode-alist」でモードラインに機能ボタンを追加する方法があることは知っていますが、動的メニューを作成する方法がわかりません。

4

2 に答える 2

6

Ok。ソリューションが設立されました.:)
最初に: キーマップを定義します:

(defconst my-mode-line-map
  (let ((map (make-sparse-keymap)))
    (define-key map [mode-line down-mouse-1]
      (make-sparse-keymap))
    map))

2番目: プロパティ化された文字列を含むリストをモードラインに追加:

(setq global-mode-string 
  (append global-mode-string 
    (list
      (propertize string-name
        'local-map my-mode-line-map
        'mouse-face 'mode-line-highlight))))

3番目:アイテムを追加できるようになりました

 (define-key my-mode-line-map 
   (vconcat [mode-line down-mouse-1]
     (list some_generated_id_for_future_use))
   (cons name function))

...そしてで削除

 (define-key my-mode-line-map 
   (vconcat [mode-line down-mouse-1] 
     (list id_of_button_that_u_gave_when_add))
   nil)
于 2012-01-27T04:36:36.347 に答える
1

より適切な方法を見つけました: マイナー モードを定義するときに、:lighter パラメータを指定できます。

(define-minor-mode my-minor-mode
  "docstring"
  nil
  :lighter (:eval (format "%s%.5s" "#" "some code if you want dynamic label"))
  ;or just string :lighter "static string"
  :keymap my-minor-mode-map
... ... ... rest of code ....

次に、easymenu を使用できます。

(require 'easymenu)

(easy-menu-define my-minor-mode-menu
  my-minor-mode-map
  "Menu for my-minor-mode"
   '("some text"
      "-")) ;separator

; and then add menu items with easy-menu-add-item and remove with easy-menu-remove-item
; it's nothing hard. Read the docs ;)

このメニューはグローバル メニュー バーに追加され、モードラインの自動追加 (:lighter パラメータを指定したため) マイナー モード ボタンをクリックするとポップアップします。

于 2012-06-25T13:10:08.900 に答える