2011-06-18 85 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