5

即使当我调用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)...

有什么办法可以让这些消息静音吗?谷歌对此并没有太大帮助。

4

2 回答 2

11

这些是通常会显示在*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)
    

    这应该只是强制 load 始终传入参数tNOMESSAGE然后加载site-run-file,如果不存在这样的文件则忽略错误。(请注意,至少在我使用 emacs 的所有 2 台机器上,没有site-run-file; 我不知道这在野外有多普遍。)

于 2012-07-16T05:08:45.987 回答
1

我去source-diving,发现该load函数调用C函数message_from_string来显示"Loading <whatever>..."消息。当 Emacs 没有以交互方式运行时,message_from_string只是直接打印到stderr没有办法避免它。好吧,您可以在参数设置为 true 的情况下调用原始load函数nomessage,但在批处理模式下运行时安排它可能并非易事。

只需过滤掉您不想要的消息就足够了:

$ emacs -batch 2>&1 | grep -v '^Loading.*\.\.\.$'
于 2012-07-16T23:31:24.143 回答