本セクションでは、コンパイルバッファにおいてシェルとその機能を利用するためのさまざまな手法やアドバイスを紹介します。この内容はローカルコンパイルに特化したものであり、デフォルトディレクトリがリモートホストにあるコンパイルバッファでは、おそらく動作しないか、あるいは無関係なものとなるでしょう。
M-x compile コマンドはシェルを使用してコンパイルコマンドを実行しますが、非対話型シェル用のオプションを指定しています。これは具体的に、シェルがプロンプトなしで起動すべきであることを意味します。もし普段使用しているシェルのプロンプトが *compilation* バッファに見栄えの悪い形で表示されている場合は、シェルの init ファイルでプロンプトを無条件に設定するという間違いを犯したことになります。(この init ファイルの名前は、使用するシェルに応じて .bashrc、.profile、.cshrc、.shrc などとなる場合があります。)シェルの init ファイルでは、すでにプロンプトが存在する場合にのみプロンプトを設定する必要があります。bash での設定方法は以下の通りです。
if [ "${PS1+set}" = set ]
then PS1=...
fi
cshでのやり方は以下の通りです:
if ($?prompt) set prompt = ...
コンパイル用サブシェルに渡される環境変数 TERM の値をカスタマイズしたい場合は、変数 comint-terminfo-terminal をカスタマイズしてください(シェルモードオプションを参照)。
Emacsは、コンパイラプロセスが非同期サブプロセスを起動することを想定していません。もし起動し、メインのコンパイラプロセスが終了した後もそれらが動作し続けた場合、Emacsはそれらを強制終了させるか、あるいは出力がEmacsに届かない可能性があります。この問題を回避するには、メインのコンパイルプロセスにサブプロセスの終了を待機させるようにしてください。シェルスクリプトでは、次のように ‘$!’ と ‘wait’ を使用して実現できます。
(sleep 10; echo 2nd)& pid=$! # Record pid of subprocess echo first message wait $pid # Wait for subprocess
バックグラウンドプロセスがコンパイルバッファに出力せず、メインのコンパイルプロセスが終了した際にそのプロセスが強制終了されるのを防ぐだけでよい場合は、これで十分です:
nohup command; sleep 1
MS-DOSでは非同期サブプロセスがサポートされていないため、M-x compileはコンパイルコマンドを同期的に実行します(つまり、コマンドが完了するまで待機しなければ、Emacsで他の操作を行うことはできません)。EmacsとMS-DOSを参照してください。