是否有可用的 Emacs paredit 钩子,以便我可以重新定义 C-j



我喜欢使用C-jeval-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))

然后通过每个主要模式钩子中的本地设置键设置自己的键。

相关内容

最新更新