我喜欢将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
在每种模式下都有不同的名称,因此我无法为所有内容定义一次密钥。相反,我需要根据我所处的主要模式绑定密钥。希望这会增加另一个有用的数据点。
答案 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设置自己的。