2014-06-09 29 views
2

是否有測試來確定正在運行的鉤子的類型 - 例如,window-configuration-change-hookEmacs - 測試確定什麼類型的鉤子正在運行

例如,我有一個函數,它包含用於確定是否應該運行的條件 - 它與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 

    . . . 
+4

正如Tobias指出的那樣,沒有明智的方法來測試它。所以雖然它可能是一個方便的功能建議,但目前您應該簡單地將您的功能分成兩部分,並將適當的功能添加到適當的掛鉤。 – phils

+0

@phils - 非常感謝! – lawlist

回答

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

+0

Upvoted提供信息,但同意「不要這樣做」。 – phils

+0

非常感謝您提供豐富的書寫和示例代碼 - 非常感謝! – lawlist

相關問題