有没有可用的Emacs paredit挂钩,所以我可以重新定义C-j?

时间:2012-06-27 20:57:18

标签: emacs elisp

我喜欢将C-j用于eval-last-sexp,但是paredit-mode(我不喜欢)将其覆盖为paredit-newline。查看paredit-mode文档,我没有看到paredit-mode-hook定义的任何内容,我可以add-hook调用local-set-key或类似函数。

有人有建议吗?

更新 在尝试了下面的两个答案并且没有取得多大成功之后,我认为这个问题可能与paredit在几个不同的环境中加载的事实有关?也就是说,我打开Common Lisp,Clojure和Emacs Lisp文件,所有这些文件都可以使用paredit。遗憾的是,各种形式的eval-last-sexp在每种模式下都有不同的名称,因此我无法为所有内容定义一次密钥。相反,我需要根据我所处的主要模式绑定密钥。希望这会增加另一个有用的数据点。

3 个答案:

答案 0 :(得分:10)

不需要使用钩子,如下所示:

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

或者,如果由于某些原因不起作用,或者您只是更喜欢使用钩子,则可以将上述define-key调用添加到paredit为{{1}}的主要模式的钩子中。激活。

答案 1 :(得分:6)

其中一个define-*-mode宏定义的每种模式都会自动运行相应的MODE-hook

我看到paredit-mode是使用(define-minor-mode paredit-mode ...)定义的次要模式,因此它将运行paredit-mode-hook

您可以输入 Mx 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")))

答案 2 :(得分:2)

有一个paredit-mode-hook。在添加内容之前,您不会看到它。很奇怪,但这是钩子的表现方式。

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

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

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