2017-09-24 118 views
1

讓我們假設我正在使用的特定模式是python-mode。 以下對鉤Emacs手冊規定了:emacs中給定主模式的eval-after-load vs hooks的執行順序

每一個主要的模式命令是應該運行正常鉤稱爲模式鉤作爲初始化的最後步驟之一。

來自主要模式約定:

每個主要模式應該有一個名爲modename-mode-hook正常模式掛鉤。主要模式命令應該做的最後一件事是撥打run-mode-hooks

with-eval-after-load在加載代碼(例如,需要)之後執行代碼,並且如果已經需要,則立即運行。

我已經按照我的init文件:

(add-hook 'python-mode-hook 'my-post-python) 

而且我已經加入

(with-eval-after-load 'python-mode 
    (setq-default python-basic-offset 7) ; setting some option 
    (add-to-list 'python-globals-list "console")) 

現在假設我開的Emacs,然後打開一個Python文件緩衝區,什麼是負載/執行關於掛鉤的訂單和with-eval-after-load?從開始指定的文檔看來,模式鉤子將在with-eval-after-load代碼之前運行?

更具體地說,每次進入緩衝區/進入當前緩衝區時都會運行模式鉤子? (P.S.這很難從文檔/手冊中找到,歡迎任何在文檔/手冊中澄清上述內容的鏈接)。

回答

2

現在假設我開的Emacs,然後打開一個python文件緩衝區,是什麼相對於掛鉤,並與-EVAL-後負荷加載/執行順序?

假設python.el尚未已經被加載,然後:

  • 您訪問foo.py
  • set-auto-mode被調用並確定python-mode是合適的,並調用它。
  • python-mode函數(此時)是python-mode庫的自動裝載定義,它隨後被加載。
  • 在加載結束時,對python-mode庫的with-eval-after-load進行評估。
  • 真正的python-mode函數(通過加載庫重新定義)被調用,結束時:
  • python-mode-hook運行。

模式掛鉤是否每次進入緩衝區/運行當前緩衝區都運行?

不,它們在每次調用模式函數時都會運行。


默認庫是python.el它使用(provide 'python),但是從你的with-eval-after-load你evidentially使用python-mode.el庫,而不是。

+0

謝謝!我查看了源代碼,從中我學到的是模式作者本身不運行鉤子(它們只是用鉤子定義鉤子),但是在那種情況下,誰運行鉤子? –

+0

主要模式通常使用'define-derived-mode'定義,它會自動創建鉤子變量並通過調用'run-mode-hooks'來定義模式命令。 – jpkotta

+0

如果OTOH您不*使用標準宏來定義模式功能,那麼您有責任手動實施所有這些預期的內務管理。 – phils