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)
    

    これは、ロードが常に引数を渡すように強制し、そのようなファイルが存在しない場合はエラーを無視して、をロードするt必要があります。(少なくとも私がemacsを使用している2台のマシンすべてには、何もありません。それが実際にどれほど一般的であるかはわかりません。)NOMESSAGEsite-run-filesite-run-file

于 2012-07-16T05:08:45.987 に答える
1

ソースダイビングを行ったところ、load関数がC関数を呼び出してメッセージmessage_from_stringを表示していることがわかりました。"Loading <whatever>..."Emacsがインタラクティブに実行されていない場合は、message_from_string直接印刷するだけstderrで、回避する方法はありません。loadパラメータをtrueに設定して元の関数を呼び出すこともできますがnomessage、バッチモードで実行する場合は、それを調整するのは簡単ではありません。

不要なメッセージを除外するだけで十分な場合があります。

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