2014-04-23 38 views
0

我創建一個簡單的宏禁用顯示在某些主要模式尾隨空白(我會在後面循環中dolist循環這個宏):產生的Emacs Lisp宏引用符號

(defmacro non-trailing-whitespaces-modes (mode) 
    (let ((hook (intern (concat mode "-mode-hook")))) 
    `(add-hook ,hook (lambda() (setq show-trailing-whitespace nil))))) 

這macroexpand後:(macroexpand '(non-trailing-whitespaces-modes "eshell")) ,結果是

(add-hook eshell-mode-hook 
      (lambda nil 
      (setq show-trailing-whitespace nil))) 

我想eshell-mode-hook'eshell-mode-hook,否則會引起錯誤。

+5

所以添加缺少的'''的宏代碼。 – phils

+4

鉤子中的匿名lambdas並不好:很難修改/刪除它們而沒有名稱。 我更喜歡每種模式的專用命名鉤子函數。 –

+0

它的工作原理。我認爲把'''加入',hook'使其成爲引用。 – Amumu

回答

2

簡單地改變宏的身體開始(add-hook ',hook ...)

2

無需宏,在這裏:

(defun non-trailing-whitespaces-modes (mode) 
    (let ((hook (intern (concat mode "-mode-hook")))) 
    (add-hook hook (lambda() (setq show-trailing-whitespace nil)))))