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

7
我喜欢使用来评估最后一个S表达式,但是paredit-mode(我也喜欢)将其覆盖为paredit-newline。查看paredit-mode文档,我没有看到与之类似的paredit-mode-hook定义,可以add-hook来调用local-set-key或类似功能。
有人有建议吗?
更新 尝试了下面两个答案,没有取得太大成功,我认为问题可能与paredit在几个不同的上下文中加载有关?即,我正在打开Common Lisp、Clojure和Emacs Lisp文件,它们都可以使用paredit。遗憾的是,每种模式中eval-last-sexp的各种形式名称略有不同,因此我不能仅针对所有内容定义一次键。相反,我还需要根据我所处的major mode绑定键。希望这增加另一个有用的数据点。
3个回答

13

不需要使用hooks,以下类似的代码应该可以工作:

(eval-after-load "paredit"
  #'(define-key paredit-mode-map (kbd "C-j") 'eval-last-sexp))

如果某些原因导致上述方法无效,或者你更喜欢使用钩子函数,可以将上述define-key调用添加到激活paredit的主要模式的钩子中。


6
每个由define-*-mode宏定义的模式都会自动运行相应的MODE-hook
我发现paredit-mode是使用(define-minor-mode paredit-mode ...)定义的次要模式,因此它将运行paredit-mode-hook
您可以键入M-xfind-functionRETdefine-minor-modeRET并搜索run-hooks,以查看此行为的定义位置。 编辑(基于问题的附加内容):
它们是否全部使用C-x C-e作为特定于模式的eval-last-sexp函数的默认绑定? 如果是这样,那么您可以使用以下方法:
(local-set-key (kbd "C-j") (key-binding (kbd "C-x C-e")))

1
从未意识到 Emacs 甚至在模式没有明确定义挂钩变量的情况下自动执行此行为。 - Greg E.

3

有一个 paredit-mode-hook。在添加内容之前,您看不到它。奇怪的是,这就是钩子的行为方式。

然而,在您的情况下,最好的方法可能是清除 C-j 的 paredit 绑定:

(eval-after-load 'paredit
   #'(define-key paredit-mode-map (kbd "C-j") nil))

然后在每个主要模式的钩子中通过local-set-key设置自己的键位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接