Привязка одинаковых команд из разных режимов к одной и той же клавише

Я использую emacs в нескольких режимах (ESS, Auctex, Slime, elisp и т. Д.), Используя привязки клавиш в режиме зла. Каждый из режимов взаимодействия имеет схожие функции для оценки областей, линий или буферов, которые я связал с ярлыками, используя пробел в качестве префикса.

;; bind slime's eval and elisp eval to the key sequence "<SPC>e"
(evil-define-key 'normal lisp-mode-map (kbd "<SPC>e") 'slime-eval-last-expression)
(evil-define-key 'normal lisp-interaction-mode-map (kbd "<SPC>e") 'eval-last-sexp)

Я хотел бы установить ключ по умолчанию для "типа" функции, так что мне не нужно иметь запись, подобную приведенной выше, для каждого режима взаимодействия, который я использую, и для каждой команды. Мы надеемся, что это даст более читаемый файл инициализации.emacs и упростит изменение моих привязок клавиш в будущем.

Я вполне уверен, что мог бы сделать это сам, используя серию хуков, но мне интересно, есть ли какая-либо существующая или встроенная поддержка для этого?

Спасибо

тензорное произведение

1 ответ

Решение

Я ничего не знаю о Зле, поэтому я приведу нормальное решение Emacs:

(global-set-key [?\s ?e] #'my-eval-last-sexp)
(defvar my-eval-last-sexp-command #'undefined)
(defun my-eval-last-sexp ()
  (interactive)
  (call-interactively my-eval-last-sexp-command))
(add-hook 'emacs-lisp-mode-hook
          (lambda () (set (make-local-variable 'my-eval-last-sexp-command) #'eval-last-sexp))
(add-hook 'lisp-mode-hook
          (lambda () (set (make-local-variable 'my-eval-last-sexp-command) #'slime-eval-last-expression))
...

Как видите, есть только одно упоминание ключа, который вы хотите (в данном случае [?\ S? E]). Но вы не сильно экономите на объеме кода, который вам нужно написать. Вы можете улучшить это, сделав my-eval-last-sexp немного более сложный (например, он может попытаться угадать имя команды по имени основного режима) или путем замены функции ловушки глобальным списком.

Надеемся, что в некоторых будущих Emacs все такие режимы исходного кода, которые взаимодействуют с некоторым интерпретатором / компилятором, будут делиться большим количеством своего кода, так что ваша проблема просто исчезнет.

Другие вопросы по тегам