我想将{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”和 (add-hook'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 :(
答案 0 :(得分:5)
我可以看到您的代码存在一些问题。首先,每次从次要模式列表中弹出时,您都会从主要模式列表中弹出。其次,您引用了(pop)
来电,这意味着您没有将所需的值传递到(add-hook)
。
当循环值为nil时,while循环不会执行其正文,因此您的第二个代码块不会通过nil
生成(message)
,因为它没有那么远。 nil只是(progn)
中产生的最终值,是遇到nil时while循环的最终返回值。
您可能希望查看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
之类的命名函数可以简化操作,因为您可以通过重新评估该函数来立即生效更改,而不是删除/添加所有钩子变量的项目。
答案 1 :(得分: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))))