*compilation* バッファでは、「コンパイルモード」と呼ばれるメジャーモードが使用されています。コンパイルモードでは、バッファ内の各エラーメッセージがハイパーリンクになります。ポイントをそのメッセージに移動して RET と入力するか、マウスでクリックする(マウスによる参照の辿る を参照)ことで、別ウィンドウでそのエラーメッセージの ロカス を表示できます。ロカスとは、そのエラーが発生したファイル内の具体的な位置のことです。
*compilation* バッファの表示は、*compilation* バッファの一部(例えばエラーメッセージ用の compilation-error や警告メッセージ用の compilation-warning)をハイライトするために使用されるフェイスをカスタマイズすることで制御できます。なお、これらのフェイスは
error および warning
フェイスを継承しているため、代わりに親フェイスを直接カスタマイズすることも可能です。
カスタマイズ変数とフェイスの一覧をすべて表示するには、M-x customize-group RET compilation を使用してください。
変数 compilation-auto-jump-to-first-error を nil 以外の値に変更すると、Emacs は *compilation* バッファに最初に現れたエラーメッセージの箇所に自動的に移動します。(この変数には
if-location-known や first-known という値も指定でき、これによりエラー箇所へ自動的に移動する条件を変更できます。)
The actual locus of an error message is determined by compilation-search-path, a list of directory names. By
default, Emacs visits the file indicated in the error message under the
directory where the compilation happens, represented by the special
directory name nil in the default value for compilation-search-path (i.e. (nil)). To make Emacs try to find the file under a
different directory (e.g. when compiling a nested project), customize compilation-search-path to include that directory. For
directory-local customization (see Per-Directory Local Variables), prefer
setting compilation-search-extra-path instead,
which Emacs considers in addition to compilation-search-path. Entries in compilation-search-extra-path take precedence over
entries in compilation-search-path.
コンパイルモードでは、以下の追加コマンドが利用可能です。これらのコマンドは、ハイパーリンクがエラーメッセージではなく検索マッチとなる*grep*バッファでも使用できます(EmacsでのGrepによる検索を参照)。
次のエラーメッセージまたはマッチ (next-error) の位置を参照します。
直前のエラーメッセージまたはマッチ (previous-error) の位置を参照します。
位置を次のエラーメッセージまたはマッチに移動する。その位置には移動しない (compilation-next-error)。
ポイントを直前のエラーメッセージまたはマッチに移動する。その位置には移動しない (compilation-previous-error)。
ポインタを、別のファイルで発生する次のエラーメッセージまたはマッチに移動します (compilation-next-file)。
ポイントを直前のエラーメッセージ、または別のファイルで発生したマッチに移動します (compilation-previous-file)。
次へ エラー 切り替え マイナーモードに従うと、コンパイルバッファ内でのカーソル移動に応じてソースが自動的に表示されます。
*compilation*バッファに出力が表示されている直前のコマンドを再実行します。
next-error および previous-error の次回の呼び出しで使用するバッファを選択してください。
エラーを順に辿るには、C-x ` (next-error)、あるいは同等に M-g M-n や
M-g n
と入力します。このコマンドは、コンパイルモードのバッファに限らず、任意のバッファから実行可能です。コンパイル後に初めてこのコマンドを実行すると、最初のエラーメッセージの箇所へ移動します。それ以降の
M-g M-n は、同様に次のエラーへと移動します。RET で特定のエラーへ移動したり、*compilation*
バッファ内でマウスクリックを行ったりすると、それ以降の M-g M-n
コマンドはそこから先へと進みます。M-g M-n
が辿るべきエラーメッセージがもうないと判断したとき、エラーを通知します。C-u M-g M-n はコンパイルバッファの先頭から再び開始し、最初の箇所へ移動します。
M-g M-p または M-g p (previous-error) は、逆方向にエラーを順次処理します。
next-error および previous-error コマンドは、*compilation* および *grep*
バッファにリストされているエラーやマッチに対してのみ作用するわけではありません。M-x occur
などの他のコマンドによって生成されたエラーやマッチのリストを反復処理することも可能です(その他の検索・ループコマンドを参照)。現在のバッファにエラーメッセージやマッチが含まれている場合、これらのコマンドはそれらを反復処理します。そうでない場合、Emacs
は選択中のフレームのウィンドウの中からエラーメッセージやマッチを含むバッファを探し(変数 next-error-find-buffer-function が値 next-error-buffer-on-selected-frame にカスタマイズされている場合)、次に
next-error または previous-error
で以前に使用されたバッファを探し、最後にそれ以外のすべてのバッファを探します。これらのコマンドが反復処理するバッファのうち、現在ウィンドウに表示されていないものは、すべて表示されます。next-error-select-buffer コマンドを使用すると、次回の next-error 呼び出しで使用する別のバッファに切り替えることができます。
デフォルトでは、next-error および previous-error コマンドは重要度の低いメッセージをスキップします。これを調整するのが変数
compilation-skip-threshold です。デフォルト値の 1
は、警告より重要度の低いものをすべてスキップすることを意味します。値 2 はエラーより重要度の低いものをすべてスキップすることを意味し、0
はいかなるメッセージもスキップしないことを意味します。
Emacsがエラーメッセージの箇所を検出すると、該当するソース行を一時的にハイライトします。このハイライトの持続時間は、選択中のバッファにおける箇所については変数
next-error-highlight で、選択されていないバッファにおける箇所については
next-error-highlight-no-select
で決定されます。また、メッセージが含まれるバッファ内で現在のエラーメッセージをどのようにハイライトするかを定義する変数 next-error-message-highlight をカスタマイズすることも可能です。
*compilation* バッファが左フリンジのあるウィンドウに表示されている場合(ウィンドウフリンジを参照)、位置参照コマンドはフリンジ内に矢印を挿入し、現在のエラーメッセージを指し示します。テキスト端末のようにウィンドウに左フリンジがない場合は、これらのコマンドはウィンドウをスクロールし、現在のメッセージをウィンドウの最上部に表示します。変数
compilation-context-lines を t に変更すると、代わりに0列目の前に可視の矢印が挿入されます。変数を整数値 n に変更すると、これらのコマンドはフリンジの有無にかかわらず、現在のエラーメッセージが上から n 行目にくるようにウィンドウをスクロールします。デフォルト値の nil では、上述の動作となります。
コンパイル出力は非常に冗長になることがあり、その多くはユーザーにとって特に有用な情報ではありません。ユーザーオプション compilation-hidden-output
には正規表現または正規表現のリストを指定でき、それに一致する出力は非表示になります。例えば、再帰的なmakefileからの冗長な出力を非表示にするには、次のように記述します。
(setq compilation-hidden-output
'("^make[^\n]+\n"))
コンパイラからのメッセージを解析するため、コンパイルモードでは各種エラーメッセージ形式を列挙し、それぞれから位置情報を抽出する方法をEmacsに指示する変数
compilation-error-regexp-alist を使用します。同様の変数 grep-regexp-alist は、grep
コマンドの出力を解析する方法をEmacsに指示します(EmacsでのGrepによる検索を参照)。
場合によっては、compilation-error-regexp-alist
がエラーの原因となっているファイル名を正しく特定できないことがあります。ユーザーオプション compilation-transform-file-match-alist
を使用して、ディレクトリ構成要素の追加や変更、あるいは特定のコンパイラメッセージをエラーメッセージではなく単なるメッセージとして扱うなど、必要な調整を行ってください。
コンパイルモードでは、画面単位でスクロールするためのキー SPC と DEL、次のまたは前のエラーメッセージへ移動するための M-n
(compilation-next-error) と M-p (compilation-previous-error)、そして別のソースファイルの次のまたは前のエラーメッセージへ移動するための
M-{ (compilation-next-file)
と M-} (compilation-previous-file) も定義されています。
C-c C-f と入力すると、「Next Error Follow」モードを切り替えることができます。このマイナーモードでは、コンパイルバッファ内での通常のカーソル移動によってソースバッファが自動的に更新されます。つまり、エラーメッセージの上にカーソルを移動させると、そのエラーの位置が表示されます。
コンパイルモードの機能は、「コンパイル・マイナーモード」と呼ばれるマイナーモードでも利用可能です。これにより、通常のコンパイル出力バッファだけでなく、任意のバッファでエラーメッセージを解析できるようになります。M-x compilation-minor-mode と入力すると、このマイナーモードが有効になります。例えば、Rloginバッファ(リモートホストシェルを参照)では、コンパイル・マイナーモードがFTP経由でリモートソースファイルに自動的にアクセスします(ファイル名を参照)。