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

时间:2012-10-05 09:59:51

标签: emacs key-bindings evil-mode

我在多种模式下使用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 个答案:

答案 0 :(得分: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更复杂(例如,它可以尝试从主模式名称猜测命令名称),或者通过用全局列表替换钩子函数来改进它。

希望在未来的某些Emacs中,与某些解释器/编译器交互的所有此类源代码模式将共享更多代码,以便您的问题能够消失。