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

Ado*_*obe 2 emacs

我想将{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)))
  )
)
Run Code Online (Sandbox Code Playgroud)

这个循环的问题是list的最后一个元素是"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)
        )
  )
)
Run Code Online (Sandbox Code Playgroud)

打印零:(

phi*_*ils 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))
Run Code Online (Sandbox Code Playgroud)

my-coding-config如果您决定稍后包含一些新功能(例如包括另一个次要模式),则定义命名函数会简化操作,因为您可以通过重新评估该函数来立即生效更改,而不是删除/添加项目那些钩子变量.