我有一个 emacs 宏(global-set-key),它在我的 .emacs 文件中工作得很好,但出于某种原因,它在我的 .c 文件中不起作用。
(global-set-key "\C-c\C-d""\C-a\C-\C-e\M-w\C-j\C-y")
如果我关闭并重新打开我的 .emacs 文件并开始乱搞,这个宏会按预期运行,将一行复制到下面的一行。然而,当我打开一个 C 文件时,同一个宏只是删除了一个字符(它似乎只在 C-d 上出现)。
有什么想法吗?
最佳答案
cc-mode将c-mode-base-map
中的C-c C-d定义为c-hungry-delete-forward
,即在全局级别隐藏您的绑定(bind)。因此,解决此问题的更好方法是取消定义 cc-mode
进行的绑定(bind),您可以使用以下方法实现:
(eval-after-load "cc-mode"
'(define-key c-mode-base-map (kbd "C-c C-d") nil))
您也可以在钩子(Hook)中执行此操作,但我更喜欢 eval-after-load
,因为它只执行一次。
注意:我通过在 c-mode
中打开一个文件并键入 C-h C-k C-c C-d(又名 M-x describe-binding C-c C-d), 然后看到:
C-c C-d runs the command c-hungry-delete-forward, which is an interactive compiled Lisp function in `cc-cmds.el'.
这很清楚绑定(bind)是在(其中一个)c-mode
中设置的,所以我只是打开(或 grep
ed) c-hungry-delete-forward
的源文件,于是我发现:
(define-key c-mode-base-map "\C-c\C-d" 'c-hungry-delete-forward)
然后答案就很直接了。
我认为最好取消定义隐藏您想要的全局绑定(bind)的局部绑定(bind),而不是重新定义它们。找到有问题的绑定(bind)同样需要做很多工作,这样,如果您想更改全局绑定(bind)的功能,您只需在一个地方进行。
关于Emacs 宏在 .emacs 文件中有效,但在源文件中无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10936273/