问题描述
|
我想将{whitespace和yas / minor-mode}次要模式挂接到某些主要模式。当然可以手动完成,但是我想要一个循环。所以我试图写它:
(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)))
)
)
此循环的问题在于,列表的最后一个元素为\“ nil \”,并且
(加钩\'nil \'nil)
给出一个错误。
然后,我尝试使用if逃避nils,但它不起作用:
(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)
)
)
)
打印nil :(
解决方法
好吧,我可以看到您的代码有几个问题。首先,每次从次要模式列表中弹出时,都会从主要模式列表中弹出。其次,您引用
(pop)
调用,这意味着您没有将想要的值传递给(add-hook)
。
当循环值为nil时,while循环不会执行其主体,因此您的第二个代码块不会通过(message)
产生nil
,因为它不会走那么远。 nil只是在那个ѭ6produced中产生的最终值,它是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))
如果您决定以后再包含一些新功能(例如,包括另一个次要模式),则定义诸如“ 9”之类的命名功能将简化操作,因为您只需重新评估一个功能即可使更改立即生效,而不是删除/添加项至所有这些钩子变量。
, 用这个:
(dolist(挂钩
(列出lisp-mode-hook rst-mode-hook python-mode-hook emacs-lisp-mode-hook文本模式-hook tcl-mode-hook c-mode-hook fortran-mode-hook))
(添加钩子钩(lambda()
(空白模式1)
(是/次模式1))))