emacs によるコンパイルの設定
これを使うと Emacs 上でエラー箇所にジャンプできてすごく便利です。
このコンパイル機能に関する設定のあれこれ。
エラー行解析パターンの修正
コンパイルするとコンパイル実行のバッファで色がついたり、エラー箇所にジャンプできたりします。
これはエラー行を解析する正規表現があって、これに当てはまればエラー行として認識されます。
VC++ などを含めた主要なコンパイラの形式には対応しているのですが、たまにコンパイラが日本語で警告やエラーと出してエラー行のマッチングにあわないときがあります。そういった場合でもエラー行の解析パターンを修正すると使えるようになります。
また、その修正を使えるようになれば、コンパイルや grep だけでなく、単体テストのエラー箇所などいろいろな用途にコンパイルの機能が使えます。
(require 'compile)
(setq compilation-error-regexp-alist
(append
'(
;; "foo.c", 34 行目: 警告
("^\"\\(.*\\)\", \\([0-9]+\\) 行目: \\(警告\\)" 1 2 3)
("^\"\\(.*\\)\", \\([0-9]+\\) 行目: " 1 2)
;; 1> test_foo.c:101 :
("^[0-9]+> +\\([^,\" \n\t]+\\):\\([0-9]+\\) *" 1 2)
("^行番号: \\([0-9]+\\), ファイル: \\(.*\\)$" 2 1)
)
compilation-error-regexp-alist))
各リストの意味は次のようなものです。
("パターン" "ファイル名のマッチング番号" "行番号" "err,warnning など"
err,warnning などのマッチング番号は色をかえるためのものなので省略してもかまいません。
先に compile をロードしているのは、ロード前に設定しているとそれが使われてデフォルトのものがロードされないためです。
キーバインディングの設定
M-x compile と毎回入力するのは面倒なので、キーに割り当てます。 VisualStudio っぽく F7 キーに割り当てる場合には以下のように .emacs.el に記述します。
(global-set-key [F7] 'compile)
デフォルトコマンドを変更する
コンパイルを実行した後の最初に出てくるコマンドを変更する場合、 .emacs.el に以下の行を追加します
(setq compile-command "MSBuild.exe")
これは M-x customize-group の後、 compilation と入力して出てくるカスタマイズ用の画面からも設定できます。
yafm.el - コンパイル、grep を使いやすくする emacs-lisp
追記 2012-10-23
Emacs 24 に対応しました。旧版はこちら。機能
コンパイルや grep を行うとバッファにエラー(検索が見つかった)箇所が表示されると思います。このバッファで n, p キーを押すとエラー箇所を移動して、その該当箇所を別バッファに表示します。これでエラー、検索結果を軽快に見ていくことができるようになります。

キーバインディング
キー | 機能 |
---|---|
p | 前のエラー |
n | 次のエラー |
o | 隣のバッファに移動 |
q | バッファを閉じる |
対象機能
- コンパイル、grep
- diff
- バッファ内検索(occur)
occur はあまり有名ではないかもしれませんが、 バッファ内の grep のような機能です。 キーは特に割り当てらていないので、 M-x occur で実行します。
インストール
使用する場合には yaml.el をパスの通ったところにおき、 以下のコードを .emacs.el に記述します。(autoload 'yafm-mode "yafm" "follow mode for compilation/occur buffers" t) (add-hook 'compilation-mode-hook 'yafm-mode) (add-hook 'diff-mode-hook 'yafm-mode) (add-hook 'occur-mode-hook 'yafm-mode)
Emacs でのコンパイルに未対応のコンパイラーへの対処法
しかし、コンパイラーのエラーメッセージが日本語化していたり、 フォーマットが違ったりするとエラー行として認識できなくて使えないということがあります。 こういった場合の対処方法について書いてみました。
これができるようになるとコンパイルや grep だけでなく、 単体テスト(XUnit)のような好きなコマンドでジャンプ機能を使えるようにもなります。
対応コンパイラーを増やすためには compilation-error-regexp-alist というリストに判定のための正規表現を追加します。
grep の場合は grep-regexp-alist です。
追加は次のようなコードを .emacs.el に記述します。
(require 'compile) (setq compilation-error-regexp-alist (append '( ;; エラー E2451 foo.cpp 1058: ("^\\(エラー\\|警告\\) \\([A-Z0-9_]+\\) \\([^ ]+\\) \\([0-9]+\\):" 3 4 1) ;; "bar.c", 34 行目: 警告 ("^\"\\(.*\\)\", \\([0-9]+\\) 行目: \\(エラー\\|警告\\)" 1 2 3) ;; 1> foo_bar.c:101 : ("^[0-9]+> +\\([^,\" \n\t]+\\):\\([0-9]+\\)" 1 2) ) compilation-error-regexp-alist))追加しているのは次のような形式のリストです。
(正規表現 ファイルパス 行番号 キーワード)正規表現は文字列で指定し、それ以降はマッチするカッコの番号を指定します。
ファイルと行番号はジャンプに必須のものですが、 キーワードは Error や Warning のような文字のハイライト用なので、なくても構いません。
もっと例を見たい場合には次のようにして変数を確認してみてください。
C-h v compilation-error-regexp-alist RETまた、表示された *Help* バッファの `compile' 上で Retrun を押すと定義位置に移動することもできます。