Emacs elisp:沉默”;“装载”;批处理模式下的消息
即使我调用Emacs elisp:沉默”;“装载”;批处理模式下的消息,emacs,elisp,Emacs,Elisp,即使我调用emacs-batch(即,批处理模式,而不实际执行任何操作),emacs也会吐出一大堆消息: $ emacs -batch Loading 00debian-vars... Loading /etc/emacs/site-start.d/50autoconf.el (source)... Loading /etc/emacs/site-start.d/50cmake-data.el (source)... Loading /etc/emacs/site-start.d/50devhe
emacs-batch
(即,批处理模式,而不实际执行任何操作),emacs也会吐出一大堆消息:
$ emacs -batch
Loading 00debian-vars...
Loading /etc/emacs/site-start.d/50autoconf.el (source)...
Loading /etc/emacs/site-start.d/50cmake-data.el (source)...
Loading /etc/emacs/site-start.d/50devhelp.el (source)...
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...
Loading debian-ispell...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...
Loading /etc/emacs/site-start.d/50psvn.el (source)...
有没有办法让这些信息保持沉默?谷歌对此并没有太大帮助。这些消息通常会显示在
*messages*
缓冲区中,而这些消息将被发送到stderr。以下是几种让它安静下来的方法,按复杂程度的增加顺序排列:
- 最简单的修复方法是重定向stderr,如果您不打算使用它:
emacs -batch 2>/dev/null
- 这些消息来自加载在中的内容。如果您不需要初始化文件中的任何其他功能,可以尝试:
emacs -batch --no-site-file ... # ignore system-wide emacs -batch -Q ... # ignore everything
- 理论上,可以通过
来实现这一点,但事实上,此处打印的是站点文件,这意味着您可能无法提前完成(setq force load messages nil)
- 建议使用
函数,以便始终使用load
调用该函数。这是一张草图:NOMESSAGE
这将强制加载始终通过(defadvice load (before quiet-loading (&optional NOMESSAGE) activate) (setq NOMESSAGE t)) (load site-run-file t)
参数中的NOMESSAGE
,然后加载t
,如果不存在此类文件,则忽略错误。(请注意,至少在我使用emacs的所有两台机器上,都没有站点运行文件
;我不知道这在野外有多普遍。)站点运行文件
load
函数调用C函数message\u from_string
来显示“加载…”
消息。当Emacs不以交互方式运行时,来自字符串的消息只会直接打印到stderr
,无法避免。当然,您可以调用原始的load
函数,并将nomessage
参数设置为true,但在批处理模式下运行时安排该参数可能并不简单
只需过滤掉您不想要的消息即可:
$ emacs -batch 2>&1 | grep -v '^Loading.*\.\.\.$'
好建议。我想制作一个安静的makefile片段来编译elisp文件。重定向stderr不是一个好主意,因为我希望错误消息仍然被打印出来。这些消息肯定来自站点范围的elisp,因为-Q
会使它们静音。我不确定这是否明智,因为正在编译的elisp可能需要从站点文件加载内容。我完全不知道您的上下文,但我想大多数elisp实际上会做一些工作来满足它的需求。我的印象是站点文件主要用于emacs会话中的自定义,而不是批处理模式。上下文如下:,我试图编写一个Makefile后缀规则来编译elisp。不幸的是,debian修补了emacs的startup.el
,以加载他们自己的东西,编写elisp来检测debian的存在并重新实现其加载过程是不可能的。尽管如此,这是正确的答案,所以享受你的滴答声吧。非常感谢。次要的一点,但是强制加载消息就是这样做的;所以你不能用它来抑制信息。干得好。您知道是否可以触发站点文件的正常加载(被-Q
停止的文件)?如果是这样,我可能能够通过-Q
,在(加载)
上提出一些建议,然后启动正常的加载过程。您应该能够只使用(加载站点运行文件)
加载站点文件。考虑到这一点,我认为您使用-Q
的解决方案和一些关于加载的建议绝对是一条可行之路;如果你以前从未写过任何建议,我很乐意为你写一个草图。@CraigCitro:这看起来是最好的方式,你能写一个草图作为新的答案吗?当我执行emacs-Q-batch--eval”(加载站点运行文件)
时,我得到了一个错误:错误的类型参数:stringp,nil
@JackKelly:我最终将它添加到了上一个。