efm langserverでdeno fmtとprettierを使い分ける
tl;dr
- efm langserverを使って
deno fmt
とprettier
を使い分ける方法を紹介します。 -
root-markers
とrequire-marker: true
を使うことでdenoのプロジェクトとprettier
を使っているプロジェクトで使い分けることができます。
deno fmt
v.s. prettier
Denoのフォーマッタであるdeno fmt
はdenoの公式リポジトリに含まれています。
一方で、prettier
はTypeScriptのフォーマッタとして広く使われています。
両者は同じTypeScriptのファイルを対象にしながらポリシーは異なるため、
Denoを使っているプロジェクトではdeno fmt
を使い、それ以外ではprettier
を使うという使い分けが必要です。
efm langserverの設定
efm langserverは各種の言語のためのツールをLanguage Server Protocol(LSP)サーバーとして提供できるツールです。
efm langserverを使うことで、deno fmt
やprettier
をLSPクライアントであるvim-lsp、nvim-lspやcoc.nvimから利用できるようになります。
deno fmt
とprettier
の使い分けのため、今回はefm langserverの設定ファイル.efm-langserver.yaml
に以下のように設定します。
version: 2
tools:
deno_fmt:
...
require-marker: true
root-markers:
- deno.json
- deno.jsonc
prettier:
...
require-marker: true
root-markers:
- .prettierrc
- .prettierrc.json
- .prettierrc.js
- .prettierrc.yml
- .prettierrc.yaml
- .prettierrc.json5
- .prettierrc.mjs
- .prettierrc.cjs
- .prettierrc.toml
- prettier.config.js
- prettier.config.cjs
- prettier.config.mjs
ほんの少し解説
肝はroot-markers
とrequire-marker: true
です。
root-markers
にはフォーマットを実行する対象ファイルのプロジェクトルートを示すファイルを指定します。
denoの場合はdeno.json
などのファイル、prettierを使う場合は各種の.prettier*
ファイルが相当します。
これにrequire-marker: true
を追加すると、root-markers
にマッチするプロジェクト配下でない場合はそのファイルに対してフォーマットを実行しません。
注意点
ただしこの設定は、denoやprettierの設定がきちんとプロジェクト内に置いてあることが前提になっています。
また、denoのプロジェクトとprettierを使うプロジェクトとがディレクトリ階層上で親子関係になっている様な場合はこの方法では対応できません。
正直、そんな構成はあまり見たことがないので、この方法で十分だと思いますが、念のため。
Discussion
一部のユーザーはdenops/もマーカーに入れておくといいよね、というご指摘いただきました。
おっしゃるとおりで、私もdenops/をマーカーに入れております(たしか)