Suppose we have 3 mode, one such rule is like key map for mode 1 should always come before mode 2, and mode 3 should always come before mode 1, finally mode 3 should always come before other minor mode. Is there a easy way to do it? How is the order determined in emacs? Thank you for your help.
Asked
Active
Viewed 832 times
2
1 Answers
3
For a minor mode MY-MINOR-MODE, you can make the bindings of that mode override ALL others (major and minor modes) by advising load
as below:
(defadvice load (after give-my-keybindings-priority)
"Try to ensure that my keybindings always have priority."
(when (not (eq (car (car minor-mode-map-alist)) 'MY-MINOR-MODE))
(let ((mykeys (assq 'MY-MINOR-MODE minor-mode-map-alist)))
(assq-delete-all 'MY-MINOR-MODE minor-mode-map-alist)
(add-to-list 'minor-mode-map-alist mykeys))))
(ad-activate 'load)
So if you want MINOR-MODE-A at the highest priority followed by MINOR-MODE-B, followed by MINOR-MODE-C, you would do:
(defadvice load (after give-my-keybindings-priority)
"Try to ensure that the keymap priorities are in the following order:
MINOR-MODE-A > MINOR-MODE-B > MINOR-MODE-C."
(when (not (eq (car (car minor-mode-map-alist)) 'MINOR-MODE-C))
(let ((mykeys (assq 'MINOR-MODE-C minor-mode-map-alist)))
(assq-delete-all 'MINOR-MODE-C minor-mode-map-alist)
(add-to-list 'minor-mode-map-alist mykeys)))
(when (not (eq (car (car minor-mode-map-alist)) 'MINOR-MODE-B))
(let ((mykeys (assq 'MINOR-MODE-B minor-mode-map-alist)))
(assq-delete-all 'MINOR-MODE-B minor-mode-map-alist)
(add-to-list 'minor-mode-map-alist mykeys)))
;; `when' block for the highest priority minor mode put at the very last
(when (not (eq (car (car minor-mode-map-alist)) 'MINOR-MODE-A))
(let ((mykeys (assq 'MINOR-MODE-A minor-mode-map-alist)))
(assq-delete-all 'MINOR-MODE-A minor-mode-map-alist)
(add-to-list 'minor-mode-map-alist mykeys))))
(ad-activate 'load)

Kaushal Modi
- 25,651
- 4
- 80
- 183
minor-mode-map-alist
similar to what I need to do forminor-mode-alist
. – Kaushal Modi Jun 25 '15 at 20:54