Sto creando la mia modalità secondaria per emacs. Ora voglio aggiungere il pulsante a modeline. Fare clic su questo pulsante per visualizzare il menu a comparsa. Le voci di questo menu dipendono dalle azioni dell'utente. So che c'è un modo per aggiungere un pulsante di funzione per modellare con `minore-mode-alist ', ma non ho idea di come creare un menu dinamico.Aggiungi pulsante con menu dinamico alla modeline di emacs?
8
A
risposta
1
ho trovato più modo corretto: Quando si definisce modo minore, è possibile specificare: param leggero
(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 ....
quindi è possibile utilizzare 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 ;)
Questo menu saranno aggiunti al menu globale -bar e verrà visualizzato se si fa clic su Auto aggiunto (causa specificata: parametro più leggero) pulsante in modalità secondaria su modeline.
6
Ok. Soluzione fondata :)
Primo:. Definire alcuni keymap:
(defconst my-mode-line-map
(let ((map (make-sparse-keymap)))
(define-key map [mode-line down-mouse-1]
(make-sparse-keymap))
map))
Secondo: accodare la lista con la stringa propertized per modeline:
(setq global-mode-string
(append global-mode-string
(list
(propertize string-name
'local-map my-mode-line-map
'mouse-face 'mode-line-highlight))))
Terzo: Ora è possibile aggiungere elementi con
(define-key my-mode-line-map
(vconcat [mode-line down-mouse-1]
(list some_generated_id_for_future_use))
(cons name function))
... e rimuovere con
(define-key my-mode-line-map
(vconcat [mode-line down-mouse-1]
(list id_of_button_that_u_gave_when_add))
nil)