2014-04-23 20 views
0

我要排除不需要show-trailing-whitespace模式:無法設置與dolist全局變量的elisp

(set-default 'show-trailing-whitespace t) 

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

(defvar trailing-whitespace-exclude-modes '(eshell term help diff ztree org calendar syslog slime-repl Info ielm)) 

(dolist (m trailing-whitespace-exclude-modes) 
    (non-trailing-whitespaces-modes m)) 

但是,使用dolist我無法添加掛鉤,但加入idividual呼籲各模式下工作,例如:

(non-trailing-whitespaces-modes eshell) 
(non-trailing-whitespaces-modes term) 
(non-trailing-whitespaces-modes ielm 

怎麼了?

回答

1

簡單:

(macroexpand '(non-trailing-whitespaces-modes m)) 
;; (add-hook (quote m-mode-hook) 
;;   (lambda nil (setq show-trailing-whitespace nil))) 

你的任務並不真正需要你用宏。 把你的宏變成一個功能,你就完成了。

這裏的等效defun定義,可以在dolist使用:

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

我明白了。宏使用參數符號,因爲它是。那麼,至少我更瞭解宏觀。另外,通過變成一個函數,你的意思是我應該創建一個鉤子列表併爲這些鉤子添加函數?如果是這種情況,那就是我使用宏的原因,所以我不必編寫'-mode-hook'。 – Amumu

+0

如何在傳入宏之前對'm'進行評估?再讀一點,參數列表是用來製作自定義語法的,所以沒有辦法評估。 – Amumu

+0

謝謝。功能解決方案很整潔。但是,如何用宏來解決這個問題,其中參數符號是從字面上理解的? – Amumu