是否有测试来确定正在运行的挂钩类型 - 例如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
. . .
答案 0 :(得分:3)
AFAIK没有标准化的方法来确定哪个钩子正在运行。
如果你想使用advice
或类似的东西存储这些信息,你必须知道钩子可以在钩子内运行。请参阅以下示例。
这意味着您需要一个类似堆栈的结构来存储该信息。
编辑:该示例现在包括存储当前正在运行的挂钩的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)
注意:如果从lisp的C instaead调用run-hooks
,则此方法无效。此外,还有其他功能,如run-hook-with-args-until-success
。