(add-hook 'haskell-mode-hook
(lambda()
(setq indent-tabs-mode t)
(setq tab-width 4)
(message "OK")))
在我~/.emacs.d/init.el
,則(lambda ...)
並得到執行,當我進入haskell-mode
。
但是,如果我用這樣的功能:
(defun my-add-hook (hook tmode twidth)
(add-hook hook
(lambda()
(setq indent-tabs-mode tmode)
(setq tab-width twidth)
(message "OK"))))
,然後再打它~/.emacs.d/init.el
像這樣:
(my-add-hook 'haskell-mode-hook t 4)
然後什麼也不會發生(即使是 「OK」 的消息ISN」 t顯示)。 add-hook
a 從defun
內無法使用的特殊功能?我在單獨的初始化文件中定義了每個項目 設置,該文件檢測緩衝區名稱 並將(lambda()...)
調用添加到相關的主要模式(在上面的示例中爲 ,haskell-mode
);我想通過使用上面的my-add-hook
這樣的薄 包裝來減少代碼的詳細程度,但我不知道爲什麼add-hook
難以如此 。
EDIT1:增加了用於說明的代碼。編輯2:當我嘗試使用my-add-hook
時,出現「文件模式規範錯誤:(void-variable tmode)」消息。
我認爲你需要在t'詞法binding',或使用報價/所享有的拉姆達。 – 2014-10-28 16:34:27
問題是Emacs Lisp沒有使用詞法作用域,所以'twidth'在鉤子被調用時不會有'4'的值。 – Barmar 2014-10-28 16:34:40
@Barmar:我不知道Emacs中的詞彙範圍意味着什麼,但是我忘了提及當使用'my-add-hook'時我得到了「File mode specification error:(void-variable tmode)」;所以,你是對的變量是無效的,但我該如何解決它? – 2014-10-28 16:49:19