emacsでミスを教えてくれるflymakeをC++のために使うための設定

GulfweedさんのTopCoderのエントリに従ってプラグインを入れると自分の好きなエディタでTopCoderに参加することができます。それに加えて,Emacsでflymakeを使えばエラーに気付きやすくなります。(結局何を.emacsに書けばいいのかは追記を見てください)

上のスクリーンショットではint型とunsignedなものを比較してるのでwarningがでてますね.
flymakeはカレントディレクトリの中にあるMakefileを実行してエラーを教えてくれます。最初のほうでMakefileを使う方法を紹介し、その下の追記でMakefileを使わない方法を紹介しまてます。

.emacs.el

;; Flymake
(require 'flymake)

;; ;; C++
;; ;; http://d.hatena.ne.jp/pyopyopyo/20070715/

(add-hook 'c++-mode-hook
  '(lambda ()
      (flymake-mode t)))

.emacs.elに書くのはこれだけでok. C++-modeのときに(flymake-mode t)というのを実行する無名関数をaddEventListenerする(<- ActionScript脳)

Makefile

check-syntaxというtargetを持ったMakefileを作成。

CC	= g++
CFLAGS	= -Wall
INCLUDES = .
# SRC	= $(shell find . -type f -mmin -30 -regex ".*.cpp")

check-syntax:
	$(CC) -o nul $(CFLAGS) $(INCLUDES) -S ${CHK_SOURCES}

コメントアウト部分は30分以内に更新されたファイルを対象に構文チェックを行おうとしたもの。

最初そうやってコンパイルするべきファイルを絞り込んでやろうと思ったのだけれど、flymakeのマニュアルのサンプルの「4.2.2Example - Configuring a tool called via make」にはflymake-simple-make-initがCHK_SOURCESという今編集しているファイル名をくれるようなのでそれを利用することにした。

Makefileを作らなくてもsmart-compileみたいにやってくれるとよりsmartなんだけどなー。

追記

にゃあさんのところにMakefileを使わないエントリがありました。他のflymakeの使い方も詳しく載ってます。

http://d.hatena.ne.jp/nyaasan/20071216/p1

僕は.cppでC++ファイルを書くので

(require 'flymake)

(defun flymake-cc-init ()
  (let* ((temp-file   (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
         (local-file  (file-relative-name
                       temp-file
                       (file-name-directory buffer-file-name))))
    (list "g++" (list "-Wall" "-Wextra" "-fsyntax-only" local-file))))

(push '("\\.cpp$" flymake-cc-init) flymake-allowed-file-name-masks)

(add-hook 'c++-mode-hook
          '(lambda ()
             (flymake-mode t)))

.emacsに追加しました。さようならMakefile.

ちなみにflymake-allowed-file-name-masksへのpushを間違えると「Flymake: No bundlefile(Makefile) found」とかエラーが出ます。