Clojure開発環境でのリンターclj-kondo, Joker設定まとめ: Spacemacs, IntelliJ IDEA (Cursive), VS Code (Calva), Vim (vim-iced)

お好みのエディタ/IDEに[Clojure](https://clojure.org/)開発環境を用意したら、ぜひリアルタイムでチェックが走るClojureのリンターを設定しましょう。

バグの疑いのあるコードやコミュニティの標準的なイディオムから外れたコードなどに素早く気づくことができて非常に便利です。

エディタ/IDEとプラグインによってサポート状況に差がありますが、以下の2種類のリンターを準備し、動作するように設定します。

- [clj-kondo](https://github.com/clj-kondo/clj-kondo): GraalVMでネイティブコンパイルされたClojureリンター
- [Joker](https://github.com/candid82/joker): Go言語製のClojureリンター(Clojureのサブセットに対するインタプリタとしても使える)

両者は機能的に重なる部分もありますが、カバー範囲が異なるため可能であれば両方とも設定しておくと便利です。

本記事では[Clojure開発環境での基本操作まとめ: Spacemacs, IntelliJ IDEA (Cursive), VS Code (Calva), Vim (vim-iced), rebel-readline](https://qiita.com/lagenorhynque/items/0b52575e90bad563e4bd)と同様に2020年時点でClojurianに特に人気のエディタ/IDEでの設定方法に絞って紹介します。

- [Spacemacs](https://www.spacemacs.org/) + [Clojure layer](https://github.com/syl20bnr/spacemacs/tree/develop/layers/+lang/clojure)
- [IntelliJ IDEA](https://www.jetbrains.com/ja-jp/idea/) + [Cursive](https://cursive-ide.com/)
- [VS Code (Visual Studio Code)](https://azure.microsoft.com/ja-jp/products/visual-studio-code/) + [Calva](https://marketplace.visualstudio.com/items?itemName=betterthantomorrow.calva)
- [Vim](https://www.vim.org/) + [vim-iced](https://github.com/liquidz/vim-iced)

他のエディタ/IDEをご利用の方は各ツールのサポート状況と設定方法をご確認ください。

# 共通: clj-kondoとJokerのインストール

macOSの場合、[Homebrew](https://brew.sh/index_ja.html)でインストールするのが簡単です。

```shell
$ brew install borkdude/brew/clj-kondo candid82/brew/joker
```

特にclj-kondoは非常に活発に機能追加が行われているので、こまめに最新化すると良いでしょう。

# Spacemacs + Clojure layerの場合

Clojure layer (developブランチ)の[Enabling Automatic Linting](https://github.com/syl20bnr/spacemacs/tree/develop/layers/+lang/clojure#enabling-automatic-linting)を参考に、`~/.spacemacs` のClojure layerに対する設定でclj-kondoとJokerをリンターとして有効化します。

```emacs-lisp:~/.spacemacs
(defun dotspacemacs/layers ()
  (setq-default
   ...
   dotspacemacs-configuration-layers
   '(...
     (clojure :variables
              clojure-enable-linters '(clj-kondo joker))
    )
   ...))
```

動作例:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/1afafa62-9632-8808-6122-b52e6acf7021.png)

# IntelliJ IDEA + Cursiveの場合

clj-kondoの[Editor integration > IntelliJ IDEA > File Watchers + installed binary](https://github.com/clj-kondo/clj-kondo/blob/master/doc/editor-integration.md#file-watchers--installed-binary)を参考に、clj-kondoとJokerが動作するように設定します。

- 1. (Ultimate Editionでない場合) [File Watchers](https://plugins.jetbrains.com/plugin/7177-file-watchers)プラグインをインストールする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/c768ca7b-24a2-a118-706a-d9674890471e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/ae245681-a8b6-fa2a-c990-5e690b2c25c2.png)

- 2. `Tools > File Watchers` でファイルタイプ `Clojure`, `ClojureScript`, `CLJC` に対するプロジェクト横断(Level: `Global`)の設定を追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/c989ead5-6e40-d7ac-06e4-245af9e85fca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/76b682be-df91-b8fa-7c79-63ddbff53db1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/6a321614-869e-ae52-92df-bc0a21e0b0a5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/d5cf8fbb-18d5-d3b6-1e96-913db4ba25c6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/65529084-2ac4-4424-1e34-7a497ec7db17.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/af7393ad-bb29-fdb9-393a-8ba52a033246.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/ed3d64f5-f944-087a-7fc2-1524c9a62f9c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/c04c9253-fa24-d9b7-3d4a-984f8180803d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/c90ab3a6-b912-04c7-5b0e-06125ee60a89.png)

動作例:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/796743db-8d73-c067-918e-012ca60f6620.png)

# VS Code + Calvaの場合

[Linting - Calva User Guide](https://calva.io/linting/)にあるように、Calvaにバンドルされた[clj-kondo](https://marketplace.visualstudio.com/items?itemName=borkdude.clj-kondo)が有効化されるようです。

また、[Clojure Linter (Joker)](https://marketplace.visualstudio.com/items?itemName=martinklepsch.clojure-joker-linter)をインストールするとJokerもリンターとして組み込むことができます。

動作例:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/30a810b2-f1d0-4995-8c31-d52a145d5155.png)

# Vim + vim-icedの場合

clj-kondoの[Editor integration > Vim / Neovim > ALE](https://github.com/clj-kondo/clj-kondo/blob/master/doc/editor-integration.md#ale)を参考に、プラグイン[ALE](https://github.com/dense-analysis/ale)を導入して以下のように設定することでclj-kondoとJokerをリンターとして有効化します。

```vimscript:~/.vimrc
let g:ale_linters = {'clojure': ['clj-kondo', 'joker']}
```

動作例:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33430/c67bfa40-a799-b988-c555-e210cbd1565c.png)

# Further Reading

- [Clojure/ClojureScript関連リンク集 - Qiita > エディタプラグイン](https://qiita.com/lagenorhynque/items/68c314c288b75a9492ba#%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3)
- [Clojure開発環境での基本操作まとめ: Spacemacs, IntelliJ IDEA (Cursive), VS Code (Calva), Vim (vim-iced), rebel-readline - Qiita](https://qiita.com/lagenorhynque/items/0b52575e90bad563e4bd)
- [Clojure開発環境でのフォーマッターcljstyle設定まとめ: Spacemacs, IntelliJ IDEA (Cursive), VS Code (Calva), Vim (vim-iced) - Qiita](https://qiita.com/lagenorhynque/items/a5d83b4a36a1cf1cacbe)
- [Clojureで快適なREPL駆動開発のために"reloaded workflow"を実践しよう - Qiita](https://qiita.com/lagenorhynque/items/a752ffae490e83ebe70d)