C/C++のコードを動的にシンタックスチェックするflymakeパッケージの使い方をまとめます。
Table of Contents
1 flymakeパッケージとは
動的にシンタックスチェックを実行するemacsパッケージです。
Eclipse等のIDEでコーディングしながらシンタックスチェックがされているのをemacsでもやる為のものです。
flymakeパッケージはemacsに組み込まれておりインストール作業不要です。
1.1 インクルードパスの問題
flymakeはインクルードパスが明確になっていないと使うことができません。
include文でエラーが発生してしまい、正しい結果が得られません。
使いたいプロジェクトではflymake用のMakefileを用意するようにすれば良いと思います。
2 flymake-cursorパッケージのインストール
flymakeのエラーと警告文をミニバッファ上に表示するパッケージです。M-x package-list-packagesでインストールします。
flymake-cursor 1.0.2 installed Show flymake messages in the minibuffer after delay
3 .emacsの設定
requireでemacs起動時にflymakeを有効にします。
(require 'flymake)
warningとerrorメッセージのハイライト色を変更します。
(custom-set-faces '(flymake-errline ((((class color)) (:background "red")))) '(flymake-warnline ((((class color)) (:background "red")))))
ヘッダファイルはそのままだとシンタックスチェックされないので、ヘッダファイルもMakefileでシンタックスチェックするのにします。
(push '("\\.h\\'" flymake-simple-make-init flymake-master-cleanup) flymake-allowed-file-name-masks)
C/C++でflymake-modeとflymake-cursor-modeを有効にします。
(add-hook 'c++-mode-hook '(lambda() (flymake-mode t) (flymake-cursor-mode t) (setq flymake-check-was-interrupted t) (local-set-key "\C-c\C-v" 'flymake-start-syntax-check) (local-set-key "\C-c\C-p" 'flymake-goto-prev-error) (local-set-key "\C-c\C-n" 'flymake-goto-next-error) ) )
こちらの方が書かれている設定がとても参考になります。カーソルを合わせた時にエラーをミニバッファに表示させます。
(defun flymake-show-help () (when (get-char-property (point) 'flymake-overlay) (let ((help (get-char-property (point) 'help-echo))) (if help (message "%s" help))))) (add-hook 'post-command-hook 'flymake-show-help)
3.1 Makefileが必要
デフォルトだとMakefileのcheck-syntaxターゲットが必要になります。CFLAGSにインクルードパスを設定しておきます。
check-syntax: $(CC) $(CFLAGS) -Wall -Wextra -fsyntax-only $(CHK_SOURCES)
C++の場合は$(CXX) $(CXXFLAGS)にすれば良いでしょう。
3.2 Makefileを使わない方法
こちらの方がMakefileを使わない方法について書かれております。ただし、独自のインクルードパスを設定している環境で問題になります。
4 ショートカット
.emacsで設定したショートカットは以下の通りです。
シンタックスチェックはバッファに変更がある度に実行されますが、C-cキーC-vキーで明示的に実行することもできます。
C-cキー C-vキー | シンタックスチェックの実行 |
C-cキー C-pキー | 前の検出箇所に移動 |
C-cキー C-nキー | 次の検出箇所に移動 |
5 実行例
シンタックスチェックで以下のようにハイライトされます。
bar関数はstaticにも関わらず呼び出し箇所がなく、main関数は引数を使っていない為に警告文が出ます。