gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:53:58 25 4
gpt4 key购买 nike

我想将 {whitespace 和 yas/minor-mode} 次要模式 Hook 到一些主要模式。当然,这可以手动完成,但我想要一个循环。所以我尝试写一下:

(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”并且 (添加钩子(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 :(

最佳答案

嗯,我发现您的代码存在一些问题。首先,每次从次要模式列表中弹出时,都会从主要模式列表中弹出。其次,您引用了 (pop) 调用,这意味着您没有将所需的值传递给 (add-hook)

当循环值为 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 这样的命名函数可以简化事情,因为您只需通过以下方式即可使更改立即生效重新评估该函数,而不是向所有这些钩子(Hook)变量中删除/添加项目。

关于emacs - .emacs 循环将一些次要模式分配给一些主要模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6395683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com