Emacs 将不同模式的类似命令绑定到同一个键

Emacs 将不同模式的类似命令绑定到同一个键,emacs,key-bindings,evil-mode,Emacs,Key Bindings,Evil Mode,我在多种模式(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-ex

我在多种模式(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)
;;将slime的eval和elisp eval绑定到键序列“e”
(邪恶定义键“正常lisp模式映射(kbd“e”)“slime eval last表达式”)
(邪恶定义键“正常lisp交互模式映射(kbd“e”)“评估上一个sexp”)
我想为一个“类型”的函数设置一个默认键,这样我就不需要为我使用的每个交互模式和每个命令都设置上面的条目。这将有望提供一个更可读的.emacs init文件,并使将来更改密钥绑定更容易

我很确定我可以使用一系列的钩子来实现这一点,但我想知道是否有任何现有的或内置的支持

谢谢


tensorproduct

我对邪恶一无所知,因此我将给出正常的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中,与某些解释器/编译器交互的所有此类源代码模式都将共享更多的代码,这样您的问题就会简单地消失。

是的,这就是我想实现的。我只是希望可能已经有东西在那里了。