2

我有一个 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 上拾取)。

有任何想法吗?

4

2 回答 2

6

cc-mode 定义C-c C-dc-mode-base-mapbe 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-modes中设置的,所以我只是打开(或grep编辑)源文件,c-hungry-delete-forward然后我发现:

(define-key c-mode-base-map "\C-c\C-d"     'c-hungry-delete-forward)

然后答案是直截了当的。

我认为最好取消定义隐藏所需全局绑定的本地绑定,而不是重新定义它们。找到有问题的绑定同样需要做很多工作,这样如果您想更改全局绑定的功能,您只需在一个地方进行。

于 2012-06-07T20:43:46.330 回答
0

显然,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而不是全局的来将绑定仅应用于此缓冲区。

于 2012-06-07T16:57:00.847 回答