dprint とても良いよ


dprint とは

dprint とは Rust で実装され高速に動作するコードフォーマッタです。
一応、売りを公式ページからコピペすると以下の通りです。

  1. フォーマットは非常に高速です。
  2. プラグインは、URLまたはファイルパスからインポートできるWebAssemblyファイルです。
  3. 公式プラグインは高度な設定が可能で、好みに合わせてコードを自動フォーマットできます。
  4. URLから構成をインポートして、再利用および共有できます。

実際動かしてみると、”すっ” と動作する感じです。この動作の軽快さは Deno のビルトインのフォーマッタやリンタの軽さに通じるところがあります。(deno fmt の内部で dprint が動いているので当たり前ですが。)
VS Code の拡張機能にも対応しているので、Deno User は是非お試しあれ!!

インストール

公式のインストールページ の通りです。Linux だと以下の通りです。

curl -fsSL https://dprint.dev/install.sh | sh

コマンド実行後にインストーラの指示通りに PATH を通せば完了です。

実行!

CLI として実行したい場合はまずは設定ファイルを作ります。

$ dprint init
What kind of project will dprint be formatting?

More information: https://dprint.dev/sponsor

> commercialEvaluation Dprint is formatting a project whose primary maintainer is a for-profit
                       company or individual and it is being evaluated for 30 days.
  commercialSponsored  Dprint is formatting a project whose primary maintainer is a for-profit
                       company or individual AND the primary maintainer sponsored the project.
                       Thank you for being part of moving this project forward!
  openSource           Dprint is formatting an open source project whose primary
                       maintainer is not a for-profit company (no sponsorship requirement).
  educational          Dprint is formatting a project run by a student or being used for
                       educational purposes (no sponsorship requirement).
  nonProfit            Dprint is formatting a project whose primary maintainer is a non-profit
                       organization (no sponsorship requirement).
Select plugins (use the spacebar to select/deselect and then press enter when finished):
> [x] dprint-plugin-typescript
  [x] dprint-plugin-json
  [x] dprint-plugin-markdown
  [x] dprint-plugin-rustfmt

プラグインを選べ的なことを言われるので、対象としたいものを選択します。

フォーマットチェックだけして、ファイルを書き換えたくない場合は

$ dprint check

フォーマットしたい場合は、

$ dprint fmt

で OK! (雑)

最後に背景というか本論というか愚痴

ただ僕は assertNotMatch() の Usage がドキュメントに書いていなかったから、修正して pull request を出しただけなんだ。そうしたら、Deno の github action の CI が fail してしまった。

どうも python から formatter を呼び出したら差分が出てしまい、「おい、ちゃんとフォーマットしろよ!」ということらしいです。Deno の勉強するときはいつも deno fmtdeno lint のお世話になっていますが、マークダウンで怒られるとは...。python コードを眺めてみるとどうも md ファイルに対してはdprint というものが動いているようで、こいつでちゃんとフォーマットチェックをしないとダメらしいです。いや、知らんがな...。

(2020/09/18 追記)
マークダウンでも deno fmt 使わせろよというissue がありました。

ちなみに本記事投稿時に dprint について書いている日本語記事は「ESLint 上で dprint を使う」くらいしか見当たりませんでした (そして、あちらは至極全うな記事)。

今後、dprint という文字列を見て、「何これ?」と思う人が少しでも減ればと思い、この記事を書きます。