.emacs循环将一些次要模式分配给一些主要模式

.emacs循环将一些次要模式分配给一些主要模式,emacs,Emacs,我想把{whitespace和yas/minor mode}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 m

我想把{whitespace和yas/minor mode}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)))
  )
)
这个循环的问题是list的最后一个元素是“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)
        )
  )
)
打印零:(

使用此选项:

(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)))) (杜利斯特(胡克) (列出lisp模式钩子rst模式钩子python模式钩子emacs lisp模式钩子文本模式钩子tcl模式钩子c模式钩子fortran模式钩子) (添加吊钩(λ() (空白模式1)
(yas/minor mode 1))我可以看出你的代码有几个问题。首先,每次从minor mode列表弹出时,你都会从主模式列表弹出。其次,你引用了你的
(pop)
调用,这意味着你没有将你想要的值传递到
(添加钩子)

当循环值为nil时,while循环不会执行其主体,因此第二个代码块不会通过
(message)
生成
nil
,因为它不会走那么远。nil只是该
(progn)
中生成的最终值,是while循环遇到nil时的最终返回值

您可能希望查看Emacs中的交互式调试支持,以便了解如果您的代码没有按预期的方式运行时实际发生的情况。请参阅:
M-:
(信息(elisp)调试”)
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
,可以在以后决定包含一些新功能(例如包含另一个次要模式)时简化操作因为您只需重新计算一个函数,而不是删除/添加所有这些钩子变量的项,就可以使更改立即生效。

谢谢lupin。虽然我仍然犯了smth错误:它给rst、tcl和fortran模式带来了错误-当我删除它们时,emacs告诉我“错误类型参数:symbolp,(语义默认elisp设置)”。太好了。您现在应该“接受”答案。请参阅标题“如何在此处提问”下的常见问题解答