2012-07-16 25 views
4

即使我調用emacs -batch(即批處理模式,而無需實際做任何事情),emacs的嘔吐出來的消息一大堆:的elisp:在批處理模式下的沉默「加載」消息

$ 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)... 

有什麼辦法沉默這些消息? Google對此沒有太大的幫助。

回答

8

這些都是通常會在*Messages*緩衝,這是不是到標準錯誤顯示的消息。這裏有一些方法來壓制它,在複雜的順序增加:

  • 最簡單的解決將是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) 
    

    這應該只是迫使負載在NOMESSAGE參數總是傳遞t,然後加載site-run-file,忽略錯誤,如果沒有這樣的文件存在。 (請注意,至少在我使用emacs機器上的所有2,沒有site-run-file。我不知道這是在野外如何共同)

+0

很好的建議。我想製作一個編譯elisp文件的安靜的makefile代碼片段。重定向標準錯誤並不是一個好主意,因爲我想要打印錯誤消息。這些消息絕對來自整個網站的elisp,因爲'-Q'使它們保持沉默。我不確定這是否聰明,因爲正在編譯的elisp可能需要從站點文件加載的東西。 – 2012-07-16 10:05:33

+0

我完全不知道你的上下文,但我猜測大多數elisp實際上會做一些工作來「需要」它需要的東西。我的印象是,站點文件主要用於emacs會話中的定製,而不是批處理模式。 – 2012-07-16 16:12:16

+0

上下文是在這裏:http://lists.gnu.org/archive/html/automake-patches/2012-07/msg00147.html,我想寫一個Makefile文件後綴規則編譯elisp的。 – 2012-07-16 22:13:20

1

我去源潛水,發現load函數調用C函數message_from_string以顯示"Loading <whatever>..."消息。當Emacs沒有交互式運行時,message_from_string只是直接打印到stderr,無法避免它。那麼,您可以調用原始load函數,將nomessage參數設置爲true,但在批處理模式下運行時安排該函數可能不是微不足道的。

這可能足以只是爲了過濾掉你不想要的信息:

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

不錯的工作。你知道是否有可能觸發站點文件的正常加載(通過'-Q'停止的文件)?如果是這樣,我可能會通過'-Q',在'(load)'上提出一些建議,然後啓動正常的加載過程。 – 2012-07-17 00:10:20

+1

你應該可以用'(load site-run-file)'加載站點文件'。鑑於此,我認爲你的解決方案使用'-Q'和一些關於'load'的建議是絕對要走的路。如果您以前從未寫過任何文章,我很樂意勾畫這些建議。 – 2012-07-17 08:39:36

+0

@CraigCitro:這看起來是最好的方式,你能寫一個草圖作爲一個新的答案嗎?當我做'emacs -Q -batch --eval'(加載站點運行文件)「時,我得到錯誤:'錯誤的類型參數:stringp,nil'。 – 2012-07-22 23:59:33