Emacs -- 测试以确定正在运行的钩子(Hook)类型

标签 emacs elisp

是否有测试来确定正在运行的 Hook 类型 - 例如,window-configuration-change-hook

例如,我有一个函数,其中包含用于确定是否应运行的条件 - 它与 post-command-hook 结合使用。我想对 window-configuration-change-hook 使用相同的函数,而不触发第一组条件:

(when

  (or

    (and
      (not window-configuration-change-hook) ;; illustrative example only
      (memq this-command this-last-command-inclusions)
      (not multiple-cursors-mode))

     window-configuration-change-hook) ;; illustrative example only

   . . .

最佳答案

据我所知,没有标准化的方法来确定哪个钩子(Hook)正在运行。

如果您想使用advice或类似的东西来存储此信息,您必须知道 Hook 可以在 Hook 内运行。请参阅以下示例。 这意味着您需要一个类似堆栈的结构来存储该信息。

编辑:该示例现在包含一个存储当前运行的钩子(Hook)的hook-stack。 请注意,我不建议使用此方法,因为它非常关键并且并非在所有情况下都有效。更好的是,建议模式/功能或任何您想要识别的内容。

(defvar hook-stack nil)

(defadvice run-hooks (around register-hooks activate)
  "Store current hook into `hook-stack'."
  (let ((hooks (ad-get-args 0)))
    (loop for h in hooks do
      (unwind-protect
          (progn
        (push h hook-stack)
        (ad-set-args 0 (list h))
        ad-do-it))
      (pop hook-stack)
      )))

(ad-remove-advice 'run-hooks 'around 'register-hooks)

(setq hooks1 nil)
(setq hooks2 nil)

(add-hook 'hooks1 (lambda () (message "Running hooks1, hook-stack: %S" hook-stack)))

(add-hook 'hooks2 (lambda () (message "Running hooks2") (run-hooks 'hooks1)
            (message "Finishing hooks2, hook-stack: %S" hook-stack)))

(run-hooks 'hooks2)

注意:如果 run-hooks 是从 C 调用而不是 lisp 调用,则此方法不起作用。此外,还有其他函数,例如 run-hook-with-args-until-success

关于Emacs -- 测试以确定正在运行的钩子(Hook)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24128073/

相关文章:

emacs - 将整个组织模式文件重新归档为树?

emacs - 如何查看 `package-list-package` 中的键绑定(bind)

emacs - 在 Emacs 迷你缓冲区中执行命令的简洁方法

emacs - 如何正确解析elisp中的缓冲区?

emacs - 使用 elisp 在邪恶的迷你缓冲区中移动光标

emacs - 跨 emacs 组织模式文件引用唯一 ID

emacs 中的 Ruby 模式 : how can I choose which version of ruby is ran when running irb?

emacs - css 的 html 缩进,emacs 中的 html

emacs - 你如何编写一个 emacs lisp 函数来替换一个单词?

clojure - AND 一个 bool 值和一个列表