2011-06-18 56 views
2

我想將{空白和yas /次要模式}次要模式掛接到某些主要模式。當然,這可以手動完成,但我想要一個循環。於是,我就寫:.emacs循環將某些次要模式分配給某些主要模式

(progn 
(setq modes-to-be-hooked '(lisp-mode-hook rst-mode-hook python-mode-hook emacs-lisp-mode-hook text-mode-hook tcl-mode-hook c-mode-hook fortran-mode-hook)) 
    (while modes-to-be-hooked 
    (setq my-hooks '(yas/minor-mode whitespace-mode)) 
     (while my-hooks 
     (add-hook '(pop modes-to-be-hooked) '(pop my-hooks))) 
) 
) 

這個循環的問題是列表的最後一個元素是「無」和 (添加鉤「零」零) 給出了一個錯誤。 後來我試着用,如果逃跑尼爾斯,但它不工作:

(progn 
    (setq mylist '(a b c)) 
    (while mylist 
     (progn 
      (setq temp (pop mylist)) 
      (if temp (message "%s" temp) (message "It's nil!")) 
      (sleep-for 1) 
     ) 
) 
) 

打印零:(

回答

5

那麼我可以看到幾個問題首先,你每次從你的次要模式列表中彈出你的主要模式列表;其次,你正在引用你的(pop)的調用,這意味着你沒有將你想要的值傳遞給(add-hook)

while循環在循環值爲零時不會執行其主體,因此您的第二個代碼塊不會通過(message)生成nil,因爲它不會達到那麼遠。 nil只是(progn)中產生的最終值,它是while循環遇到nil時的最終返回值。

您可能想要查看Emacs中的交互式調試支持,以便您可以找出實際發生的情況,如果代碼不符合您的預期。請參閱:
M-:(info "(elisp) debugging")RET

不過,我會建議使用lhui的解決方案,而不是解決你所擁有的。

對於替代語法,我用這個辦法:

(defun my-coding-config() 
    (whitespace-mode 1) 
    (yas/minor-mode 1)) 

(mapc 
(lambda (language-mode-hook) 
    (add-hook language-mode-hook 'my-coding-config)) 
'(lisp-mode-hook 
    rst-mode-hook 
    python-mode-hook 
    emacs-lisp-mode-hook 
    text-mode-hook 
    tcl-mode-hook 
    c-mode-hook 
    fortran-mode-hook)) 

定義像my-coding-config命名函數簡化了的事情,如果你決定以後,包括一些新的功能(如包括另一次要模式),你可以做只需通過重新評估該函數即可立即生效,而不是將項目移除/添加到所有這些鉤子變量。

+0

感謝phils - 它的工作原理! – Adobe

+0

太好了。你現在應該'接受'一個答案。請參閱標題爲「我如何在此提問?」下的常見問題解答http://stackoverflow.com/faq – phils

1

使用本:

(dolist (hook 
     (list lisp-mode-hook rst-mode-hook python-mode-hook emacs-lisp-mode-hook text-mode-hook tcl-mode-hook c-mode-hook fortran-mode-hook)) 
    (add-hook hook (lambda() 
        (whitespace-mode 1) 
        (yas/minor-mode 1))))
+0

感謝羽扇豆。我雖然仍然做錯了:它給rst,tcl和fortran模式的錯誤 - 當我刪除它們時 - 它emacs告訴我「錯誤類型參數:symbolp,(語義默認 - elisp-setup)」。 – Adobe