Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs elisp:沉默”;“装载”;批处理模式下的消息_Emacs_Elisp - Fatal编程技术网

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:我最终将它添加到了上一个。