Подтвердить что ты не робот

Буфер-локальное перекрытие привязки клавиш второстепенного режима в Emacs

Я хочу использовать второстепенный режим, который восстанавливает ключ основного режима, который я определенно хочу сохранить. Как перекрыть ключ, не удаляя его из карты второстепенного режима по всему миру? Я знаю, что могу использовать define-key для этого, но я хотел бы сохранить привязку для других буферов/основных режимов.

Может ли кто-нибудь помочь?

4b9b3361

Ответ 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)))