Emacs 宏在 .emacs 文件中有效,但在源文件中无效?

标签 emacs configuration elisp

我有一个 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 中设置的,所以我只是打开(或 greped) 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/

相关文章:

Emacs 为 "<<<"插入 EOF

emacs - 将脚注导出到 Beamer 会使它们在框架上的位置过低

python - Emacs Python 自动补全

java - ActiveMQConnectionFactory 发送超时

.net - 自定义 app.config 配置部分处理程序

emacs - 如何使参数与emacs中的函数对齐?

lisp - Lisp 中的反引号扩展

function - 如何在 elisp 中的任意点退出函数

visual-studio - 当前选择的 "Solution Configuration"选项存储在 VS 2010 或 2012 中的什么位置?

emacs - emacs 的行重复代码