Буфер-локальное перекрытие привязки клавиш второстепенного режима в Emacs
Я хочу использовать второстепенный режим, который восстанавливает ключ основного режима, который я определенно хочу сохранить. Как перекрыть ключ, не удаляя его из карты второстепенного режима по всему миру? Я знаю, что могу использовать define-key
для этого, но я хотел бы сохранить привязку для других буферов/основных режимов.
Может ли кто-нибудь помочь?
Ответы
Ответ 1
Это немного громоздко. Вы можете сделать что-то вроде:
(add-hook '<major-mode>-hook
(lambda ()
(let ((oldmap (cdr (assoc '<minor-mode> minor-mode-map-alist)))
(newmap (make-sparse-keymap)))
(set-keymap-parent newmap oldmap)
(define-key newmap [<thekeyIwanttohide>] nil)
(make-local-variable 'minor-mode-overriding-map-alist)
(push `(<minor-mode> . ,newmap) minor-mode-overriding-map-alist))))
Ответ 2
Здесь используется функция для обработки всех громоздких битов.
(defun local-set-minor-mode-key (mode key def)
"Overrides a minor mode keybinding for the local
buffer, by creating or altering keymaps stored in buffer-local
`minor-mode-overriding-map-alist'."
(let* ((oldmap (cdr (assoc mode minor-mode-map-alist)))
(newmap (or (cdr (assoc mode minor-mode-overriding-map-alist))
(let ((map (make-sparse-keymap)))
(set-keymap-parent map oldmap)
(push `(,mode . ,map) minor-mode-overriding-map-alist)
map))))
(define-key newmap key def)))
После этого вы можете сделать
(local-set-minor-mode-key '<minor-mode> (kbd "key-to-hide") nil)
Ответ 3
В моем случае company-mode
перекрывал привязки cider-repl-mode
для M-p
и M-n
, когда показывалось меню завершения работы компании. Клавиатура для меню завершения - company-active-map
, но нет соответствующего второстепенного режима (company-mode
- это когда активен не), поэтому я не мог использовать ни один из существующих ответы.
Вот что я придумал вместо этого:
(add-hook 'cider-repl-mode-hook
(lambda ()
(make-local-variable 'company-active-map)
(setq company-active-map (copy-tree company-active-map))
(define-key company-active-map (kbd "M-p") nil)
(define-key company-active-map (kbd "M-n") nil)))