代码之家  ›  专栏  ›  技术社区  ›  viam0Zah

在哪个文件中定义了keybinding?

  •  6
  • viam0Zah  · 技术社区  · 15 年前

    考虑在Emacs中输入键盘,例如 C-X-C-S . 我可以通过输入来找出它调用的函数 C-H-C 击键 ,但是我如何才能找到这个键绑定的定义位置?

    (也许正确的答案是它无法决定,因为键地图不存储这种信息。)

    2 回复  |  直到 15 年前
        1
  •  5
  •   Trey Jackson    15 年前

    Emacs不保存键绑定与函数关联的位置信息。事实上,答案通常是不确定的。

    很多时候,键绑定被设置为次要模式的副作用,或者通过模式挂钩。次要模式的键绑定通常存储在诸如 comint-mode-map . 此键映射通过设置模式变量启用 comint-mode .但是,该模式映射是一个全局变量,任何地方的任何人都可以向它添加键绑定。所以,做你想做的基本上就是跟踪谁用一个特定的值设置了一个变量。同样,对于刚刚通过模式挂钩本地设置的键绑定(使用 local-set-key )另外,您甚至可以通过 file variables . 所有这些只是为了说明Emacs中的键绑定是短暂的。

    最好的方法是找到与键相关联的函数,然后查找该文件(如果模式拆分为多个文件,则查找任何相关文件)。

    Emacs中的键绑定查找相当复杂,因为您可以通过多种方式设置/关联键笔划(全局、主模式、次模式、覆盖次模式、缓冲区本地、文本属性等)。要快速查看,请查看 this documentation .

    您可以编写这样一个函数,在次要模式中查看可以在何处设置键绑定,但当然,我的第一个测试显示键绑定没有在那里定义。但也许这一准则将具有指导意义。

    (defun guess-where-keybinding-is-defined (key)
      "try to guess where a key binding might be defined"
      (interactive (list (read-key-sequence "Describe key: ")))
      (let ((bindings (minor-mode-key-binding key))
            found)
        (while (and bindings (not found))
          (if (setq found (caar bindings))
              (find-function (cdar bindings)))
          (setq bindings (cdr bindings)))))
    

    有没有你想解决的具体问题(除了这个问题)?

        2
  •  1
  •   Nuno Furtado    15 年前

    只需执行m-x查找函数

    来自Emacs博士:

    (查找函数函数)

    查找函数的定义 近点。

    查找包含 函数近点的定义 (由 `函数在点')中调用 缓冲和放置点在 定义。移动前设置标记,如果 缓冲区已存在。