コマンドラインオプション ‘-batch’ を指定すると、Emacsは非対話モードで動作します。このモードでは、Emacsはターミナルからコマンドを読み取らず、ターミナルモードを変更せず、また消去可能な画面への出力も想定しません。その考え方は、実行するLispプログラムを指定し、それらのプログラムが完了した時点でEmacsが終了するというものです。実行するプログラムを指定する方法としては、file という名前のライブラリを読み込む ‘-l file’、引数なしで function を呼び出す ‘-f function’、あるいは ‘--eval=form’ があります。
Emacsがバッチモードで動作している場合、この変数はnilではありません。
指定したLispプログラムがバッチモードで未処理のエラーを発生させた場合、EmacsはLispデバッガを起動した後、非ゼロの終了ステータスで終了します。この際、標準エラーストリームにLispのバックトレース(デバッガの起動を参照)が表示されます:
$ emacs -Q --batch --eval '(error "foo")'; echo $?
Error: error ("foo")
mapbacktrace(#f(compiled-function (evald func args flags) #<bytecode -0x4f85c5
7c45e2f81>))
debug-early-backtrace()
debug-early(error (error "foo"))
signal(error ("foo"))
error("foo")
eval((error "foo") t)
command-line-1(("--eval" "(error \"foo\")"))
command-line()
normal-top-level()
foo 255
通常であれば message や prin1
などを用い、t をストリームとしてエコー領域に出力される Lisp プログラムの出力(出力ストリーム を参照)は、バッチモード時には代わりに
Emacs の標準ディスクリプタに出力されます。具体的には、message
は標準エラーディスクリプタに、prin1
やその他のプリント関数は標準出力に書き込みます。同様に、通常であればミニバッファから入力されるデータは、標準入力ディスクリプタから読み込まれます。したがって、Emacs
は非対話型アプリケーションプログラムとほぼ同様に動作します。(コマンドのエコー表示など、Emacs
自身が通常生成するエコー領域への出力は、完全に抑制されます。)
標準出力またはエラー記述子に書き込まれる非ASCIIテキストは、nil以外の場合、デフォルトでlocale-coding-systemを用いてエンコードされます(ロケールを参照)。これは、coding-system-for-writeを任意の符号化方式にバインドすることで上書き可能です(明示的なエンコードとデコードを参照)。
バッチモードでは、Emacsはgc-cons-percentage変数の値をデフォルトの‘0.1’から‘1.0’まで引き上げます。長時間実行される想定のバッチジョブでは、この制限値を再び下げておく必要があります。そうしないと、デフォルトでガベージコレクションの実行回数が減り(その分、メモリ消費量が増加する)ためです。