2014-10-12 50 views
1

我已閱讀eval-after-load vs add-hook。根據頁面,代碼eval-after-load被執行一次。
另一方面,add-hook內的代碼每次打開時都會運行該模式的緩衝區。何時使用加載,Emacs加載後評估

好的。但是我怎樣才能找出eval-after-load區塊或add-hook區塊內應該有哪些代碼?例如,

(eval-after-load "js2-mode" 
    '(progn 
     (js2-basic-offset 2))) 

(eval-after-load "js2-mode" 
    '(progn 
     (defun custom:js2-config() 
     (js2-basic-offset 2)) 
     (add-hook 'js2-mode-hook 'custom:js2-config))) 

我不問js2-basic-offset
是否有一個通用規則? 或..每當我使用eval-after-load,我不得不問?

回答

4

你在設置一個全局變量還是一個局部變量?

如果你正在設置一個緩衝區局部變量(一個在不同緩衝區中的值可能不同的變量),它必須在文件加載後完成,所以在主要模式鉤子中。如果您正在調用對當前緩衝區有影響的函數,那麼也會發生同樣的情況。

如果你正在設置一個全局變量,那麼在模式鉤子中這樣做是沒有意義的:只要你碰巧在特定模式下加載文件,就會改變一個全局變量。如果您正在調用影響全局設置的功能,則會發生同樣的情況。

許多全局變量可以直接在.emacs中設置,而無需等待將聲明並使用它加載的庫。事實上,全局變量通常是這種情況。

js2-basic-offset是一個變量,而不是一個函數。如果你想配置中的所有JS緩衝區壓痕,直接在.emacs設置,無論是與

(setq js2-basic-offset 2) 

,或者通過自定義界面。

如果你想在不同的文件設置不同的值,那麼你將它設置在主要模式鉤 - 像

(defun custom:js2-config() 
    (when (…) 
    (make-local-variable 'js2-basic-offset) 
    (setq js2-basic-offset 2))) 
(add-hook 'js2-mode-hook 'custom:js2-config) 

您不需要等待庫加載到添加一個鉤子。

請注意,Emacs具有內置設施,涵蓋了在每個文件或每個項目基礎上設置變量的典型用例:file-local variablesdirectory-local variables

+0

感謝您的回覆。但是我希望使用'eval-after-load'的主要原因是減少了加載時間。加載後eval中的'setq js2-basic-offset'或'add-hook'是個壞主意? – 1ambda 2014-10-12 14:38:57

+1

@ 1ambda這對於一大段代碼來說是有意義的,但是如果你只設置了一些變量,那麼用'eval-after-load'註冊它們會比直接設置它們花費更長的時間。 – Gilles 2014-10-12 14:44:40