🐼

efm langserverでdeno fmtとprettierを使い分ける

2024/03/18に公開
1

tl;dr

  • efm langserverを使ってdeno fmtprettierを使い分ける方法を紹介します。
  • root-markersrequire-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)サーバーとして提供できるツールです。

https://github.com/mattn/efm-langserver

efm langserverを使うことで、deno fmtprettierをLSPクライアントであるvim-lsp、nvim-lspやcoc.nvimから利用できるようになります。
deno fmtprettierの使い分けのため、今回は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-markersrequire-marker: trueです。
root-markersにはフォーマットを実行する対象ファイルのプロジェクトルートを示すファイルを指定します。
denoの場合はdeno.jsonなどのファイル、prettierを使う場合は各種の.prettier*ファイルが相当します。
これにrequire-marker: trueを追加すると、root-markersにマッチするプロジェクト配下でない場合はそのファイルに対してフォーマットを実行しません。

注意点

ただしこの設定は、denoやprettierの設定がきちんとプロジェクト内に置いてあることが前提になっています。
また、denoのプロジェクトとprettierを使うプロジェクトとがディレクトリ階層上で親子関係になっている様な場合はこの方法では対応できません。
正直、そんな構成はあまり見たことがないので、この方法で十分だと思いますが、念のため。

Discussion

kyoh86kyoh86

一部のユーザーはdenops/もマーカーに入れておくといいよね、というご指摘いただきました。
おっしゃるとおりで、私もdenops/をマーカーに入れております(たしか)