emacs によるコンパイルの設定

Emacs 上で M-x compile とするとコンパイルを実行することができます。
これを使うと 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

Emacs でコンパイルや grep を使いやすくする emacs-lisp を公開しました。 実際にはかなり昔に作ったものです。 名前の由来は、当時アイデアはいいけど、ちょっと使いづらいなという emacs-lisp があって、 それが fm という名前だったので、 yafm にしました。
追記 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 でのコンパイルに未対応のコンパイラーへの対処法

Emacs 上で行うコンパイルや grep はエラー箇所にジャンプができて、とても便利です。
しかし、コンパイラーのエラーメッセージが日本語化していたり、 フォーマットが違ったりするとエラー行として認識できなくて使えないということがあります。 こういった場合の対処方法について書いてみました。

これができるようになるとコンパイルや 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 を押すと定義位置に移動することもできます。
 
このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
43位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
3位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

05月 | 2017年06月 | 07月
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。