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/をマーカーに入れております(たしか)