$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

flycheck-gometalinterを利用して、EmacsでGoのシンタックスチェックや型チェックを行う

今までgolangシンタックスや型のエラーがあった時にEmacsに表示するために、flycheck標準のgo用のcheckerを利用していた。しかし、これがだんだん遅くなってきて、結構いらつく感じになってきた。そこで、flycheck-gometalinterを使ったら解決したのでメモ。

flycheck-gometalinterとは

flycheck-gometalinter とは、gometalinterシンタックスやlintのチェックをした結果を、Emacsのflycheckのインターフェースで表示してくれるもの。gometalinterはgolangのいろんなlintツール(例えばgofmtとかvetとかgotypeとか)を統合してlintを行ってくれるので、柔軟に設定して利用することができる。

flycheck-gometalinterを利用するように設定する

まずflycheck-gometalinterをインストールする。

M-x package-install RET flycheck-gometalinter

そして、重くならないようにfastオプションを付けるのと、テストファイルでも利用するようにelispで設定する。

(require 'flycheck-gometalinter)
(flycheck-gometalinter-setup) ;; flycheckのcheckerのリストにgometalinterを追加
(setq flycheck-gometalinter-fast t) ;; only run fast linters
(setq flycheck-gometalinter-test t) ;; use in tests files
(add-hook 'go-mode-hook 'flycheck-mode) ;; go-modeでflycheckを利用するように

これだけで設定が終わり。

これをしておくだけで、シンタックスエラーや型エラーなどがあった時に、flycheckがその行にエラー表示をしてくれる。


便利。

なぜデフォルトのgo-modeのcheckerが利用されなくなるか

なぜflycheck-gometalinter-setupをするだけで、デフォルトのgo-modeのcheckerが利用されなくなるのだろうと疑問だった。それでドキュメントを見て見ると、

http://www.flycheck.org/en/latest/user/syntax-checkers.html#select-syntax-checkers-automatically

Flycheck picks the first syntax checker from this list which exists and supports the current major mode, and runs it over the current buffer.

と書かれていて、つまりgo-modeに紐づく最初のcheckerが利用されることが分かった。

さらにflycheck-gometalinter-setupのコード( https://github.com/favadi/flycheck-gometalinter/blob/c90ea1aba80ddfdf603c9ba731be302400fd6ba2/flycheck-gometalinter.el#L119 )を読むと、flycheck-checkersにgometalinterをadd-to-listしている。これによって、flycheck-checkersの一番最初にgometalinterが入るため、gometalinterがgo-modeに紐づく最初のcheckerとなる。

以上から、gometalinterのみピックアップされ、デフォルトのcheckerが利用されなくなるということが分かった。

まとめ

今回はflycheck-gometalinterを利用して、golangシンタックスチェックや型チェックなどを行うように設定してみた。デフォルトのcheckerを利用すると、かなりCPUが回っていたが、この設定をすることで快適に編集できるようになったので良かった。