conform.nvimでFormatterを動かす

Neovimのプラグインconform.nvimを紹介します。

conform.nvimとは

conform.nvimはFormatterをイイ感じの挙動で動かすためのプラグインです。
バッファ全体ではなく差分で書き換えてくれるようです。

設定

設定は簡単で、ファイルタイプごとに名前を書きます。デフォルトで対応しているFormatterは:h conform-formattersまたはREADMEで見ることができます。

require("conform").setup({
formatters_by_ft = {
lua = { "stylua" },
python = { "isort", "black" },
javascript = { { "prettierd", "prettier" } },
}
})

{"A","B"}なら順次実行、{{"A","B"}}のようにリストを入れ子にすると、最初のFormatterだけが実行されます。

JavaScript系

JavaScript、TypeScript、JSXなどをいちいち書くのは面倒なので筆者は次のように変数で指定しています。

local js_formatters = { { "biome", "prettierd", "prettier" } }
require("conform").setup({
formatters_by_ft = {
-- ...
json = js_formatters,
javascript = js_formatters,
javascriptreact = js_formatters,
typescript = js_formatters,
typescriptreact = js_formatters,
astro = js_formatters,
},
})

保存時にFormatterを実行

保存時にFormatterを走らせたい場合はformat_on_saveを書いておきます。

require("conform").setup({
format_on_save = {
timeout_ms = 2000,
lsp_fallback = true,
quiet = false,
},
-- ...
})

lsp_fallback

lsp_fallbackは文字どおりLSPでFormatterを提供している場合にFallbackしてくれる機能です。

たとえばSvelteでLSPのFormatterを使いたい場合はこのlsp_fallbacktrueにしておくだけでよいです。formatters_by_ftsvelte = { "xxx" }と書いてしまうと当然そちらが優先されます。

レシピ

recipes.mdにconform.nvimのAPIを使ったレシピが用意されています。
保存時にフォーマットするかトグルできるコマンドを追加したり、遅いFormatterを非同期で実行する例が書いてあります。

docディレクトリの中にあるMarkdownファイルは見逃しがちなので忘れないうちに見ておくといいかもしれません。

確認コマンド

開いているバッファにどのFormatterが割り当てられているか確認するコマンド:ConformInfoもあります。


ちなみにconformは一致するとか同調するみたいな意味です。