我正在为 emacs 制作自己的次要模式。现在我想将按钮添加到模式行。单击此按钮必须会导致弹出菜单出现。此菜单的项目取决于用户的操作。我知道有一种方法可以使用“minor-mode-alist”将功能按钮添加到模式行,但我不知道如何制作动态菜单。
问问题
1024 次
2 回答
6
行。解决方案成立。:)
首先:定义一些键盘映射:
(defconst my-mode-line-map
(let ((map (make-sparse-keymap)))
(define-key map [mode-line down-mouse-1]
(make-sparse-keymap))
map))
第二:将带有属性化字符串的列表附加到模式行:
(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))
...并删除
(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 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 ;)
此菜单将添加到全局菜单栏,如果您单击自动添加(因为您指定:lighter param)次要模式按钮,它将弹出模式行。
于 2012-06-25T13:10:08.900 回答