是否有测试来确定正在运行的 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/