ろぼいんブログ

VS CodeやZedなどのエディターでPrettierとOxfmtが共存できない問題の対処法

約4分で読めます

ZedやVS CodeでフォーマッターとしてOxfmtを使おうとしたところ、Prettierと共存できないという問題に直面しました。対処法として、Bunをフォーマッターとして指定するのがよさそうという結論になったので、詳しくまとめました。

目次

問題の詳細

ZedはフォーマッターとしてPrettierを組み込んでおり、デフォルトではPrettierでフォーマットします。フォーマッターとしてOxfmtを使いたい場合は、次のように設定します。

settings.json
{
"formatter": {
"language_server": {
"name": "oxfmt"
}
}
}

しかし、これを設定するとPrettierが無効化されので、Prettierを使用しているプロジェクトでは.prettierrc.jsonが無視され、Oxfmtのデフォルトの設定でフォーマットされてしまいます。反対に、この設定をしないとOxfmtを使用しているプロジェクトでは.oxfmtrc.jsonが無視され、Prettierのデフォルトの設定でフォーマットされます。

広告

どちらか片方のプロジェクトしか扱わない場合は問題ありませんが、普段扱っているプロジェクトのフォーマッターがPrettierとOxfmtで混在している場合には、併用できないという問題が生じます。

一応、Zedはプロジェクトの.zed/settings.jsonで設定を上書きます。そのため、広く使われているPrettierをグローバル設定のフォーマッターにして、Oxfmtを使っているプロジェクトではプロジェクト設定でOxfmtを使うように構成できます。

自分で管理しているプロジェクトではそれで問題ありませんが、他人の管理するプロジェクトでは勝手にZedの設定を追加するわけにもいきません。

Zedでしか確認していませんが、おそらくVS Codeでも同様の問題が生じると思われます。

対処法

この問題についてChatGPTと議論していたところ、フォーマッターとしてBunを設定するのがよさそうという結論になりました。

広告

Bunはv1.4.4でPrettierとOxfmtの両方と互換性のあるbun fmtコマンドを導入しました。bun fmtは、.prettierrc.jsonのあるプロジェクトではPrettier互換のフォーマッターとして振る舞います。また、.oxfmtrc.jsonのあるプロジェクトではOxfmt互換のフォーマッターとして振る舞います。

つまりbun fmtを使えば、プロジェクトがPrettierとOxfmtのどちらを使用しているかにかかわらず、設定を読み込んでフォーマットできるということになります。

なお、bun fmtはPrettierとOxfmtの両方と互換性があることになっていますが、内部でそれらを使っているわけではないので、エッジケースで異なるフォーマット結果になる可能性は否定できません。それでも、そのようなケースはまれでしょうし、ほとんどのプロジェクトはCIでフォーマットをチェックしていると思うので大きな問題はないと考えます。

Zedの場合は、システムにBun v1.4.4以降をインストールして次のように設定することで、Bunをフォーマッターとして利用できます。

settings.json
{
"formatter": {
"external": {
"command": "bun",
"arguments": ["fmt", "--no-script", "--stdin-filepath", "{buffer_path}"]
}
}
}

VS Codeでは、Simple LSP Clientのような拡張機能をインストールして、Bunをフォーマット用の言語サーバーとして登録します。VS CodeのSimple LSP ClientではPowerShellのプロファイルが読み込まれないようで、miseなどでBunを管理している場合はバイナリーの絶対パスを指定する必要がありました。

広告
settings.json
{
"simpleLspClient.formatters": {
"bun": {
"cmd": [
"bun",
"fmt",
"--no-script",
"--stdin-filepath",
"${file}"
],
"filetypes": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"json",
"jsonc",
"css",
"scss",
"less",
"html",
"markdown",
"yaml"
]
}
},
"[javascript][javascriptreact][typescript][typescriptreact][json][jsonc][css][scss][less][html][markdown][yaml]": {
"editor.defaultFormatter": "wdomitrz.simple-lsp-client",
"editor.formatOnSave": true
}
}

まとめ

ZedやVS CodeでPrettierとOxfmtが共存できない問題の対処法について解説しました。

通常の設定ではPrettierとOxfmtを共存させられないので、bun fmtコマンドをフォーマッターとして指定することで、実質的にそれらを共存させられます。

記事をシェア

フォローして最新情報を入手

Googleの優先ソースに追加すると、このサイトの記事をGoogleで見つけやすくなります。また、ぜひXやRSSフィードもフォローしてください。

Googleの優先ソースとして追加するGoogleの優先ソースとして追加する
広告
著者のアイコン画像

生まれた時から、母国語よりも先にJavaScriptを使っていました。ネットの海のどこにもいなくてどこにでもいます。

Webフロントエンドプログラマーとして、TypeScriptを用いたWebアプリやブラウザー拡張機能を制作。Xのシャドウバン検知ツール「Shadowban Scanner」やリンクカード復活ツール「Restore Link Card」を公開し、国内外のメディアで紹介されました。iGEM 2023ではJapan-UnitedチームのWikiを制作してGrand Prizeの獲得に貢献。ブログではXやSNSの最新ニュース、不具合の検証と対処法、フロントエンド開発の知見を発信しています。