2016年3月4日金曜日

【Emacs】flycheckでエラー、警告をソースコード中に表示する


Emacs上でシンタックスチェックするパッケージとしてはflymakeが有名ですが、より設定が簡単かつ柔軟にできるflycheckがその役割を台頭してきています。

こんな感じです。

まだflymakeも未導入の方はflycheckの方がおすすめですし、既にflymake導入済みの方もflycheckへの移行をおすすめします。

筆者がflycheckをおすすめする3つの理由

いろんな言語に対応している

たった一行、(global-flycheck-mode)と書き込むだけでC/C++はもちろん、Python, LispやLaTeXにまで対応しています。

Windowsでも動いた

筆者はMacとWindowsでEmacsを利用しているのですが、WindowsだとMacで動作している一部のパッケージを設定変えずにそのまま利用することができません。
以前使っていたflymakeがそのうちの一つだったのですが、flycheckはなんと同じ設定でWindows, Mac両方で動作します。
筆者、大満足です。

設定が楽

一つ目の理由で書いた通り、一行の設定でいろんな言語に対応していますし、独自のシンタックスチェッカーの定義も簡単にできます。
ソースコード編集中にシンタックスチェッカーを切り替えることもできます。

もうflycheck使うしかないですよね?
使いましょう。

インストール

MELPAにあるので簡単にインストールできます。
M-x list-packagesでflycheckを探してインストールしてもいいですし、

M-x package-install RET flycheck
でもいけます。

設定&使い方

まずはエラーや警告間の移動の設定。
(require 'flycheck)

(global-flycheck-mode)

(define-key global-map (kbd "\C-cn") 'flycheck-next-error)
(define-key global-map (kbd "\C-cp") 'flycheck-previous-error)
(define-key global-map (kbd "\C-cd") 'flycheck-list-errors)
C-c n, C-c pでエラー・警告を行ったりきたりして、C-c dでエラー・警告の一覧を表示させます。
基本的にこれだけで使えますが、初期設定のコンパイラが自分好みでない場合は独自にシンタックスチェッカーを定義できます。
筆者はC++11に準拠した以下のような設定を使っています。
(flycheck-define-checker c/c++11
  "A C/C++ checker using g++."
  :command ("g++" "-Wall" "-Wextra" "-std=c++11" source)
  :error-patterns  ((error line-start
                           (file-name) ":" line ":" column ":" " Error: " (message)
                           line-end)
                    (error line-start
                                 (file-name) ":" line ":" column ":" " Fatal Error: " (message)
                           line-end)
                    (warning line-start
                             (file-name) ":" line ":" column ":" " Warning: " (message)
                             line-end))
  :modes (c-mode c++-mode))
3行目でコンパイル方法を定義してあげています。
他にもオプション付けたかったら" "で囲んだものを列挙していけばいいです。
4--12行目が、コンパイラが出力するエラーや警告のパーサーを定義しています。

ソースコード開いて、自分が定義したチェッカーを使いたい場合は
M-x flycheck-select-checker RET c/c++11
とやればおkです。

おわりに

導入から設定までが簡単なflycheckをみなさんも是非使ってみてください。

6/22 追記

オリジナルのチェッカーをデフォルトに設定する

以下のようにすると自分で作ったc/c++11というチェッカーがC++モードのデフォルトのチェッカーになります。
(add-hook 'c++-mode-hook
          '(lambda()
             (flycheck-select-checker 'c/c++11)))

flycheckに標準搭載のc/c++-clang, c/c++-gccをC++11に準拠させる

上述のようにオリジナルのチェッカーを作らなくても、flycheckに標準搭載されているチェッカーをC++11に対応させることができました。
以下のように記述するだけです。
(add-hook 'c++-mode-hook (lambda()
                           (setq flycheck-gcc-language-standard "c++11")
                           (setq flycheck-clang-language-standard "c++11")))

ただ筆者の場合、Homebrew版のLLVMのclangバイナリにclangのエイリアスが割り当てられており、これだと色々不都合があった1 のでflycheckでは/usr/bin/clangを使うようにしました。 以下の設定を書き込んでおきます。
(setq flycheck-c/c++-clang-executable "/usr/bin/clang")

これで快適に使用できます。

1llvm-config --cflags --libsなどを付けないとパスが通らない


1 件のコメント :