Emacs - 测试以确定正在运行的挂钩类型

时间:2014-06-09 20:04:28

标签: emacs elisp

是否有测试来确定正在运行的挂钩类型 - 例如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

   . . .

1 个答案:

答案 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