EmacsはCやFortranのような対話的でない言語のコンパイラをサブプロセスと して実行し,エラー記録をバッファに取り込むことができます.またエラーメッ セージを解析してエラーが発見されたファイルを読み込み,エラーが起こった行 へポイントを移動することができます.
grep
を実行し,マッチした行を
`*compilation*'バッファに取り込みます.
grep
のサブプロセスの実行を止めます.
grep
でマッチした位置に
移動します.
make
または他のコンパイラを実行するには,M-x compileを入力
します.このコマンドはミニバッファからシェルコマンドを読みとり,読んだコ
マンドを,サブプロセスのシェルで出力を`*compilation*'バッファに切替
えて実行します.カレントバッファのデフォルトディレクトリが,コマンド実行
のためのワーキングディレクトリとして使われます.このため,このディレクト
リのmakefileが通常使われます.
シェルコマンドを読むときには,ミニバッファにデフォルトのコマンドが表示
されます.これは最後にM-x compileを行なった際に実行したものです.
RETだけを押すと同じコマンドが再び実行されます.はじめてのM-x
compileではデフォルトとしてmake -k
が表示されます.デフォルトは変
数compile-command
から得ます.ファイルの適当なコンパイルコマンドが
make -k
以外のときは,そのファイルでcompile-command
をローカ
ルに設定すると便利です(see section ファイル内のローカル変数).
コンパイルが開始されると`*compilation*'バッファが他のウィンドウに 表示されますが選択はされません.モード行のかっこ内に`run'あるいは `exit'と表示されるので,コンパイルが終了したかどうかがわかります. `*compilation*'バッファを表示しておく必要はありません.どのようになっ てもコンパイルは続けられます.
コンパイルプロセスの実行を止めるには,M-x kill-compilationを入力 します.`*compilation*'バッファのモード行は`run'から `signal'に変わります.別の新しいコンパイルを始めると,実行中のコン パイルは止められます.実行できるのは常に1つだけです.実行中のコンパイル を実際に止める前に確認を求められます.
コンパイラのエラーメッセージを解析するには,C-x `
(next-error
)を入力します.C-xに続く文字はアクサングレーブで,
引用符ではありません.このコマンドは1つのウィンドウで
`*compilation*'バッファを,別のウィンドウで次のエラーが起こったバッ
ファを表示します.そのバッファのポイントはエラーが発見された行へ移動しま
す.相当するエラーメッセージは`*compilation*'が表示されているウィン
ドウの最上部へスクロールされます.
コンパイルの開始後,はじめてC-x `が使用されるときにすべてのエラー メッセージを解析し,エラーメッセージが出力されたすべてのファイルを読み込 んで,エラーメッセージのある行を示すマーカーを作ります.そして先頭のエラー メッセージの位置にポイントを移動します.続けてC-x `を使用すると, 最初のときに作ったデータを使って先に進みます.用意されたエラーメッセージ がなくなったときは,次のC-x `であとから加わったエラーメッセージを 調べます.これはコンパイルを実行中にコンパイルエラーの編集を始めるのに便 利です.新たなエラーメッセージがなければ,C-x `がエラーになります.
C-u C-x `はそれまでに作ったエラーメッセージデータを捨ててもう一 度`*compilation*'バッファを解析し,最初のエラーを表示します.このよ うにして,同じエラーを再び処理できます.
コンパイラを実行する代わりに,grep
を実行してマッチした行を見る
ことができます.これには,通常grep
に与えるのと同じ引数をつけて
M-x grepを実行します.すなわち,grep
スタイルの正規表現(シェ
ルの特殊文字のためシングルクォートを使う)と,ファイル名(ワイルドカードが
使用できます)です.grep
の出力は`*compilation*'バッファに取り
込まれ,マッチした行はコンパイルエラーのようにC-x `で見つけられま
す.
注意:シェルはコンパイルコマンドを実行するために使用されます.しか
しシェルは非対話的に動作するようになっています.特にシェルはプロンプトな
しで動作を始めます.普通のシェルのプロンプトが`*compilation*'バッファ
に現われたら,シェルの初期化ファイル(`.cshrc'あるいは`.shrc'な
ど)の書き方が間違っています.無条件にプロンプトを設定するのは間違いです.
初期化ファイルではプロンプトがあるときだけ別のプロンプトを設定するように
します.csh
では次のようにします.
if ($?prompt) set prompt = ...