0

我在多种模式(ESS、Auctex、Slime、elisp 等)中使用 emacs,所有这些都使用邪恶模式键绑定。每种交互模式都有类似的功能,用于评估我使用空格键作为前缀绑定到快捷方式的区域、行或缓冲区。

;; 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 init 文件,并使将来更改我的键绑定更容易。

我相当确定我可以自己使用一系列钩子来做到这一点,但我想知道是否有任何现有或内置的支持?

谢谢

张量积

4

1 回答 1

2

我对 Evil 一无所知,所以我将给出正常的 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更复杂一些来改进它(例如,它可以尝试从主要模式名称中猜测命令名称),或者通过将钩子函数替换为全局 alist。

希望在未来的某些 Emacs 中,所有与某些解释器/编译器交互的源代码模式都将共享更多代码,这样您的问题就会消失。

于 2012-10-05T16:22:54.470 回答