flycheckでcredoを実行する

credoというのがある.

github.com

これはElixirの静的解析ツールで,まぁrubocopみたいなものだと思っていただければ良い.これは単なるCLIなのだが,これに違反した場合,違反箇所をエディタ上に表示してほしいと思った.

そこでflycheck-credoというのがある.

github.com

これでcredoを実行して結果をflycheckに連携してくれるので,Emacs上でそれを見ることができるのだ.

しかし,lsp-modeを有効化しているとこれがうまいこと動作しない.実はlsp側が内部でflycheckを実行し,この結果を表示してくれているのだが,flycheck-credoの結果はこのlsp内部から実行されるflycheckにより結果が上書きされてしまう. その結果credoとしてのエラーがflycheckに表示されなくなっている. 試しに一度lsp-modeを無効化した上で,flycheck-credoを入れてみて欲しい.ちゃんと動作するから.

ただ現代においてlspを無効化するのはあまり現実的ではないので,なんとかこの2つに共存していただきたい.

というわけで,

(use-package elixir-mode
  :config
  (add-hook 'elixir-mode-hook
            (lambda ()
              (setq lsp-flycheck-live-reporting nil)
              (setq-local flycheck-check-syntax-automatically '(mode-enabled save))))
  (add-hook 'lsp-after-initialize-hook
            (lambda ()
              (flycheck-add-next-checker 'lsp 'elixir-credo)))

とやることで,これらを同居できる.

まず flycheck-add-next-checkerだが,これをやることで2つのcheckerを併用できる. その上で,lsp-flycheck-live-reporting を無効化することで,elixir-credoの結果が上書きされるのを防いでいる.

Refs: elixirforum.com