elisp:以批处理模式静音“正在加载”消息

时间:2012-07-16 04:31:33

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

有没有办法让这些消息沉默?谷歌对此并没有太大的帮助。

2 个答案:

答案 0 :(得分:9)

这些消息通常会显示在*Messages*缓冲区中,而不是stderr。以下几种方法可以让它变得更加沉稳:

  • 最简单的解决方法是重定向stderr,如果您不打算使用它:

    emacs -batch 2>/dev/null
    
  • 这些消息来自site-wide initialization中加载的内容。如果您不需要初始化文件中的任何其他功能,可以尝试:

    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)
    

    这应该强制加载始终在t参数中传递NOMESSAGE,然后加载site-run-file,如果没有这样的文件则忽略错误。 (请注意,至少在我使用emacs的所有2台机器上,没有site-run-file;我不知道它在野外有多常见。)

答案 1 :(得分:1)

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

仅过滤掉您不想要的邮件就足够了:

$ emacs -batch 2>&1 | grep -v '^Loading.*\.\.\.$'