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_fallback
をtrue
にしておくだけでよいです。formatters_by_ft
にsvelte = { "xxx" }
と書いてしまうと当然そちらが優先されます。
レシピ
recipes.mdにconform.nvimのAPIを使ったレシピが用意されています。
保存時にフォーマットするかトグルできるコマンドを追加したり、遅いFormatterを非同期で実行する例が書いてあります。
doc
ディレクトリの中にあるMarkdownファイルは見逃しがちなので忘れないうちに見ておくといいかもしれません。
確認コマンド
開いているバッファにどのFormatterが割り当てられているか確認するコマンド:ConformInfo
もあります。
ちなみにconformは一致するとか同調するみたいな意味です。