我喜欢使用C-j
来eval-last-sexp
但paredit模式(我本来喜欢)会覆盖它以paredit-newline
。查看 paredit-mode 文档,我没有看到任何定义paredit-mode-hook
之类的东西,我可以add-hook
调用local-set-key
或类似的函数。
有人有建议吗?
更新在尝试了下面的两个答案但没有取得多大成功之后,我认为问题可能与paredit在几个不同的上下文中加载的事实有关?也就是说,我打开了Common Lisp,Clojure和Emacs Lisp文件,所有这些文件都可以使用paredit。可悲的是,各种形式的eval-last-sexp
在每种模式下的名称略有不同,所以我无法为所有内容定义一次密钥。相反,我也需要根据我所处的主要模式绑定密钥。希望这增加了另一个有用的数据点。
无需使用钩子,如下所示的内容应该可以工作:
(eval-after-load "paredit"
#'(define-key paredit-mode-map (kbd "C-j") 'eval-last-sexp))
或者,如果由于某种原因不起作用,或者您只是更喜欢使用钩子,您可以将上述define-key
调用添加到激活paredit
的主要模式的钩子中。
由define-*-mode
宏之一定义的每个模式都会自动运行相应的MODE-hook
。
我看到 paredit-mode 是用 (define-minor-mode paredit-mode ...)
定义的次要模式,因此它将paredit-mode-hook
运行。
您可以键入 M-x find-function
RET,define-minor-mode
RET 并搜索run-hooks
以查看定义此行为的位置。
编辑(基于问题的补充):
它们是否都使用 C-x C-e
作为特定于模式的 eval-last-sexp 函数的默认绑定?对于他们来说,这似乎是一件一致的事情,如果是这样,那么您可以使用以下方法:
(local-set-key (kbd "C-j") (key-binding (kbd "C-x C-e")))
有一个 paredit-mode-hook。 在向它添加内容之前,您不会看到它。 很奇怪,但这就是钩子的行为方式。
但是,在您的情况下,最好的方法可能是清除 C-j 的 paredit 绑定:
(eval-after-load 'paredit
#'(define-key paredit-mode-map (kbd "C-j") nil))
然后通过每个主要模式钩子中的本地设置键设置自己的键。