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

时间:2011-06-18 11:34:08

标签: 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)))
  )
)

这个循环的问题是列表的最后一个元素是“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 :(

2 个答案:

答案 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))))