【问题标题】:When will the functions held by a hook be run in emacs?钩子持有的函数何时会在 emacs 中运行?
【发布时间】:2012-10-30 05:50:05
【问题描述】:

比如我在python-mode-hook里面放了一些代码,这些代码会在什么时候运行:

(1)每次打开python文件*.py

(2) 仅第一次触发python-mode

有人知道哪个答案是正确的吗?

谢谢!

【问题讨论】:

  • 正如其他人指出的那样,在 python-mode 的情况下,每次以 python-mode 打开文件。只做第一次的事情,你会做 (eval-after-load "python" '(progn (some-function) (setq some-var t)))。这在 python.el 加载后运行。
  • jpkotta:当然,请注意,除了调用 python-mode 之外的某些原因可能会加载 python.el(即使它可能不是特别有可能),所以我会如果我特别想在第一次致电python-mode 时采取行动,我不愿意依赖它。还可以采取其他方法。
  • Annnd,定义一个只在第一次调用模式时运行的钩子没有多大意义,因为这已经由 eval-after-load 和朋友处理了。

标签: emacs hook elisp


【解决方案1】:

没有关于钩子何时运行的一般规则:这仅由定义钩子的代码控制。但是,有一些通用的约定被遵循,其中一个是:

  • 如果foo-mode 是某种主要模式,那么每次在缓冲区中启用foo-mode 时,foo-mode-hook 都会运行。

特别是,正如已经指出的那样,python-mode-hook 中的函数在每次加载 .py 文件时都会运行。

【讨论】:

    【解决方案2】:

    如果您想查看代码,请注意绝大多数主要模式都是使用define-derived-mode 宏构造的(如果新模式不支持,则模式可以简单地为parent 提供nil 实际上从另一个派生,以便仍然从使用宏中获得相同的好处和标准行为)。

    所以 M-x find-function RET define-derived-mode RET

    您会看到调用该模式时发生的最后一件事是(run-mode-hooks ',hook)(在这种情况下,,hook 将扩展为带有-hook 后缀的模式名称)。

    因此,每次缓冲区启用该模式时(意味着执行该宏定义的模式函数),该模式的钩子也会运行(以及任何父/祖先模式的钩子 - 有趣的 delay-mode-hooksrun-mode-hooks 交互意味着在所有其他处理完成之前不会运行任何挂钩。

    【讨论】:

      【解决方案3】:

      每次打开 python 文件时它都会运行。

      然后将为这个文件缓冲区触发python模式并执行你的钩子。

      您可以通过编写一个简单的钩子来轻松测试:

      (add-hook 'python-mode-hook  (lambda () (message "python mode hook")))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-21
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多