2012-01-26 10 views
8

私はemacsのために私自身のマイナーモードを作っています。今、私はmodelineにボタンを追加したいと思います。このボタンをクリックすると、ポップアップメニューが表示されます。このメニューの項目は、ユーザーの操作によって異なります。私は `minor-mode-alist 'を使ってmodelineに関数ボタンを追加する方法があることを知っていますが、どのように動的メニューを作るのか分かりません。emacsのモードラインにダイナミックメニューのボタンを追加しますか?

答えて

1

私はより適切な方法を見つけました: あなたはマイナモードを定義するときは、指定することができます軽量のparam

(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 ;) 

をこのメニューでは、グローバルメニューに追加されますあなたが指定した原因:軽いパラメ)をクリックするとポップアップ表示されます。

6

ソリューションは、設立:)
まず:二

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

:モードラインするpropertized文字列のリストを追加します。いくつかのキーマップを定義

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

サード:今、あなたがアイテムを追加することができます

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

... with with

(define-key my-mode-line-map 
    (vconcat [mode-line down-mouse-1] 
    (list id_of_button_that_u_gave_when_add)) 
    nil)