2012-10-30 55 views
3

例如,我把一些代碼內python-mode-hook,並且代碼將被運行時:鉤子所持有的函數何時會在emacs中運行?

(1)每次我打開一個Python文件*.py

(2)只有第一次python-mode被觸發

有沒有人有想法,哪個答案是正確的?

謝謝!

+1

正如其他人指出的那樣,在python模式下,每次用python模式打開一個文件。要做的事情只有第一次,你會這樣做(eval-after-load「python」'(progn(some-function)(setq some-var t)))。這會在python.el加載後運行。 – jpkotta

+0

jpkotta:當然,注意到這個python。可以想象,除了調用'python-mode'外,el可能會被加載(即使它可能不是特別有可能),所以如果我非常特別地想要對第一個調用'python-mode'。還有其他方法可以採取。 – phils

+0

Annnd,定義一個只在第一次調用模式時才運行的鉤子沒有什麼意義,因爲這已經由'eval-after-load'和朋友處理了。 – tripleee

回答

6

有關於當鉤子運行沒有一般規則:這是由它定義了鉤的代碼完全控制。然而,也有遵循其中的一般慣例是這樣的一個:

  • 如果foo-mode是某種形式的主要模式,然後foo-mode-hook將分別foo-mode在緩存啓用時間運行。

特別是,正如已經指出的那樣,在python-mode-hook每次.py文件被加載時運行的功能。

3

它會在您每次打開python文件時運行。

然後python模式將觸發此文件緩衝區和您的掛鉤將被執行。

你可以很容易通過編寫一個簡單的鉤測試:

(add-hook 'python-mode-hook (lambda() (message "python mode hook"))) 
4

如果你想看看代碼,然後記絕大多數主要模式都與define-derived-mode宏(模式結構,能夠實現簡單的parent提供nil如果新的模式並不實際上從另一個派生,以便從使用宏中獲得相同的好處和標準行爲)。

所以的Mxfind-functionRETdefine-derived-modeRET

你會看到,在調用模式時,出現這種情況的最後一點是(run-mode-hooks ',hook)(其中,hook在這種情況下將擴大至名帶有-hook後綴的模式)。

所以每次一個緩衝器使得能夠模式(也就是說,在執行由該宏定義的模式函數)時,模式的鉤也運行(以及任何父/祖先模式鉤 - 有趣delay-mode-hooksrun-mode-hooks交互意味着在所有其他處理完成之前,沒有任何鉤子運行)。

+0

欲瞭解更多詳情,請參閱http://stackoverflow.com/a/19295380/324105 – phils

相關問題