我有一个 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 文件时,相同的宏只会删除一个字符(它似乎只在 Cd 上拾取)。
有任何想法吗?
我有一个 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 文件时,相同的宏只会删除一个字符(它似乎只在 Cd 上拾取)。
有任何想法吗?
cc-mode 定义C-c C-d为c-mode-base-map
be c-hungry-delete-forward
,它在全局级别隐藏您的绑定。因此,解决此问题的更好方法是取消定义所做的绑定,cc-mode
您可以使用以下方法:
(eval-after-load "cc-mode"
'(define-key c-mode-base-map (kbd "C-c C-d") nil))
您也可以在挂钩中执行此操作,但我更喜欢它,eval-after-load
因为它只执行一次。
注意:我通过打开一个文件c-mode
并输入C-h C-k C-c C-d(aka M-x describe-binding C-c C-d) 来确定现有的绑定,然后看到:
Cc Cd 运行命令 c-hungry-delete-forward,它是 `cc-cmds.el' 中的交互式编译 Lisp 函数。
这清楚地表明绑定是在(其中一个)c-mode
s中设置的,所以我只是打开(或grep
编辑)源文件,c-hungry-delete-forward
然后我发现:
(define-key c-mode-base-map "\C-c\C-d" 'c-hungry-delete-forward)
然后答案是直截了当的。
我认为最好取消定义隐藏所需全局绑定的本地绑定,而不是重新定义它们。找到有问题的绑定同样需要做很多工作,这样如果您想更改全局绑定的功能,您只需在一个地方进行。
显然,C 模式正在删除绑定或更改绑定。您可以尝试将其添加到 c-mode-hook 中,然后查看它是否有效。与此类似:
(add-hook `c-mode-hook '(lambda ()
(global-set-key "\C-c\C-d" "\C-a\C- \C-e\M-w\C-j\C-y")))
要么c-mode-hook
要么c-mode-common-hook
。您也可以使用local-set-key
而不是全局的来将绑定仅应用于此缓冲区。