【问题标题】:How to work out which package is unsetting keybindings?如何确定哪个包正在取消键绑定?
【发布时间】:2012-01-25 13:54:43
【问题描述】:

我的配置中的某些内容正在取消/覆盖C-c C-e 的一些标准键绑定,因此各种主要模式下的命令无法正常工作。在 AUCTeX 中 C-c C-e 应该启动“插入环境”对话框,在 org-mode 中相同的键应该启动导出/发布对话框,但是在这两种模式中 C-c C-e 是未定义的,emacs 只是等待更多输入。

我知道我可以使用 -Q 启动 emacs 并加载包直到出现问题(如果我以这种方式加载 emacs 并以 org 模式打开文件,则键绑定可以正常工作)但是,就像很多人一样,在某些时候,我的 init 文件变得非常大。有没有更快、更智能的方法?

[编辑] 我的配置中没有任何内容明确取消设置 C-c C-e

【问题讨论】:

    标签: emacs


    【解决方案1】:

    调试器可能会给你足够的线索来解决它。尝试将以下内容添加到 .emacs 的开头:

    (debug-on-entry 'global-unset-key)
    

    您可能还需要尝试'local-unset-key。详情见debugger manual

    【讨论】:

    • 很好的建议,但不幸的是没有帮助。调试显示mwheel 包是唯一调用global-unset-key 的包,但删除它并没有帮助。显然没有包调用local-unset-key。很奇怪。
    • 很奇怪。为了解决问题,我打开一个 emacs 实例,用 M-; 注释掉一半的 .emacs(并保存文件),然后打开第二个实例(不带 -Q 标志)。如果问题在第二个实例中仍然存在,请将其关闭并注释掉第一个实例中剩余的 .emacs 代码的一半。重复这个过程,你可以很快缩小搜索范围,即使配置文件很大。对不起,这就是我所拥有的:(
    • Setting 绑定到nilunsetting 相同(实际上你会发现这正是这两个函数的作用提到实际上确实如此),因此您无法使用该建议捕获所有相关事件。
    【解决方案2】:

    二分搜索是你的朋友。

    转到.emacs 的中间并添加(error "here"),然后启动 Emacs 并查看问题是否仍然存在。

    如果是,则在当前和文件顶部之间插入另一条错误行,如果不是,则注释掉当前错误并在当前和底部之间添加一个一半。

    重复二等分过程,直到找出导致问题的一两条线。

    【讨论】:

    • 好建议,我稍后试试。
    【解决方案3】:

    您可以使用C-h k C-c C-e 找出与您的组合绑定的函数。

    在弹出的帮助缓冲区中,您将获得函数名称、它的文档以及指向定义它的文件的链接。按照该链接,您将最终到达函数定义的位置。

    此时,应该很容易确定哪个包负责使用文件名重新定义您的键绑定。

    如果这没有帮助,您可以在自定义目录中为“C-c C-e”或“C-e”M-x rgrep 并手动检查所有内容。

    【讨论】:

    • 问题是这个组合是未定义的,所以C-h k 没有帮助。我的配置中没有明确取消组合,但我想我正在加载的东西必须是。
    • Raffaele Ricciardi 在 gnu.emacs.help 上建议的一种变体最终为我解决了这个问题:C-c C-e C-h 列出了所有的绑定(不仅仅是在当前的主要/次要模式中)使用这个组合。这将我指向eclim 的方向,这是罪魁祸首。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多