お好みのエディタ/IDEにClojure開発環境を用意したら、ぜひファイル保存時に自動実行できるフォーマッターも設定しましょう。
他言語におけるPrettierなどと同様に、ファイルを保存するたびにフォーマットできると非常に快適です。
Clojureのフォーマッターcljstyleの使い方 - TOYOKUMO Tech Blogという記事でも紹介されている、従来のcljfmtよりも高速に動作し高機能なcljstyleを利用します。
本記事でもClojure開発環境での基本操作まとめ: Spacemacs, IntelliJ IDEA (Cursive), VS Code (Calva), Vim (vim-iced), rebel-readlineと同様に2020年時点でClojurianに特に人気のエディタ/IDEでの設定方法に絞って紹介します。
- Spacemacs + Clojure layer
- IntelliJ IDEA + Cursive
- VS Code (Visual Studio Code) + Calva
- Vim + vim-iced
他のエディタ/IDEをご利用の方はサポート状況と設定方法をご確認ください(cf. Integrations)。
共通: cljstyleのインストールとデフォルト設定
macOSの場合、Homebrewでインストールするのが簡単です。
$ brew install --cask cljstyle
また、デフォルトで適用したい設定を ~/.cljstyle
ファイルとして配置しておくと便利です。
例えば以下のように設定すると、およそThe Clojure Style Guideのレイアウトに沿った形でフォーマットされるようになります(※ バージョン0.14.0で設定ファイルの記述形式が変更されているので注意)。
{:rules {:blank-lines {:max-consecutive 1
:padding-lines 1}
:comments {:enabled? false}
:functions {:enabled? false}
:indentation {:indents {defspec [[:inner 0]]
fdef [[:inner 0]]
for-all [[:inner 0]]}
:list-indent 1}
:namespaces {:indent-size 1}
:types {:enabled? false}}}
:rules > :indentation > :indents
の設定は必須ではありませんが、一例として私がプロジェクト横断でよく使うclojure.specやtest.checkのマクロについて設定してあります。
特定のプロジェクト固有のフォーマット設定はプロジェクトルートディレクトリの .cljstyle
ファイルで行うと良いでしょう。
Spacemacs + Clojure layerの場合
jstokes/cljstyle-modeを利用することで、ファイル保存時に cljstyle fix
相当のコマンドが自動実行されるようにすることができます。
(defun dotspacemacs/layers ()
(setq-default
...
dotspacemacs-additional-packages '((cljstyle-mode :location (recipe :fetcher github :repo "jstokes/cljstyle-mode")))
...))
(defun dotspacemacs/user-config ()
...
(add-hook 'clojure-mode-hook #'cljstyle-mode)
...)
動作例:
IntelliJ IDEA + Cursiveの場合
File Watchersを利用することで、ファイル編集時に cljstyle fix
が自動実行されるように設定することができます。
-
- (Ultimate Editionでない場合) File Watchersプラグインをインストールする
-
-
Tools > File Watchers
でファイルタイプClojure
,ClojureScript
,CLJC
に対するプロジェクト横断(Level:Global
)の設定を追加する
-
動作例:
VS Code + Calvaの場合
Save and Run (もしくはその他同種の拡張)を利用することで、ファイル保存時に cljstyle fix
が自動実行されるように設定することができます。
例えばユーザ設定ファイル settings.json
に以下のように設定すると、拡張子 .clj
, .cljc
, .cljs
の任意のファイル保存時に cljstyle fix <保存対象ファイル>
が実行されます。
{
...,
"saveAndRun": {
"commands": [
{
"match": "\\.clj[cs]?$",
"cmd": "cljstyle fix ${file}",
"useShortcut": false,
"silent": true
}
]
}
}
動作例:
Vim + vim-icedの場合
vim-iced > 9. Formattingを参考に以下のように設定すると、ファイル保存時に cljstyle fix
相当のコマンドが自動実行されるようにすることができます1。
let g:iced_formatter = 'cljstyle'
aug MyClojureSetting
au!
au BufWritePre *.clj,*.cljs,*.cljc,*.edn execute ':IcedFormatSyncAll'
aug END
動作例:
Further Reading
- Clojureのフォーマッターcljstyleの使い方 - TOYOKUMO Tech Blog
- Clojure/ClojureScript関連リンク集 - Qiita > エディタプラグイン
- Clojure開発環境での基本操作まとめ: Spacemacs, IntelliJ IDEA (Cursive), VS Code (Calva), Vim (vim-iced), rebel-readline - Qiita
- Clojure開発環境でのリンターclj-kondo, Joker設定まとめ: Spacemacs, IntelliJ IDEA (Cursive), VS Code (Calva), Vim (vim-iced) - Qiita
- Clojureで快適なREPL駆動開発のために"reloaded workflow"を実践しよう - Qiita
-
vim-icedの作者 @uochan さんから、局所的に自動フォーマットする設定例も教えていただきました: Format only current top form on writing a file ↩