【JS】prettierでmarkdownを無視したいがignoreファイルは作りたくない
こんにちは!ふたりはprettier。Mizutani(@sirycity)です。このネタわりと鉄板みたいでtwitterでいろんな人が言ってる。
今回はprettierでmarkdownファイルは無視したいけどignoreファイルは作りたくないという贅沢な悩みを解決する方法についてです。
※半分ネタです
結論
cliから実行する時はこう。
prettier '**/!(*.md)' --write --ignore-unknown --ignore-path .gitignore
さらにVSCodeの場合はsettings.json
にこれを追記。
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"[markdown]": {
"editor.formatOnSave": false
}
}
はじめに
prettierは言わずとしれたコードを整形してくれるJSのライブラリです。webフロントエンド系ならどんなコードも大抵綺麗になります。しかしmarkdownだけは例外で、これはmarkdownの仕様と日本語の仕様の相性が悪いためです。このため日本ではmarkdownだけ整形の対象から除外することがよくあります。
.prettierignoreを使った除外
prettierには.prettierignore
というファイルに書かれたファイルを除外する必要があります。ここに拡張子.md
を追加すれば…
*.md
これでok。これで終了。簡単でしょ?
ふたりはprettier
ところで、VSCodeとかのエディタで使えるprettierは2種類あるんですね。npmで管理する普通のライブラリとVSCodeのプラグインの2種類。
npmで管理するprettier
これは普通にnpmでインストールするライブラリです。他のライブラリと一緒。コマンドラインからこんな感じでprettierを実行できます。
npx prettier . --write
別にprettierはこれだけでも使えるんですよ。ただ、毎回毎回これを実行するのはめんどいですね。保存したら自動で実行したいよね。なのでそのためにあるのがVSCodeのプラグインです。
VSCodeのプラグインのprettier
このprettierはVSCodeのライブラリとしてのprettierです。VSCodeのGUIからインストールするタイプね。実際に多くの場合はこっちを使います。ちなみに、もしこっちだけを使う場合はnpmでprettierをインストールする必要はなく、npm i -D prettier
とかする必要はないです。
こっちのprettierの役目は保存した時に整形することです。それだけ。
2つのprettierの設定ファイル
もし2つのprettierが全然違う動きしたら大変ですね。なのでこの2つ、設定ファイルは同じやつを使います。設定ファイルってのは.prettierrc.js
とか.prettierignore
とかそういうやつね。
なのでnpmのprettierが入ってなくてVSCodeのprettierだけだったとしても、VSCodeのprettierは.prettierrc
の設定を参照します。ちょっと変な感じするね。
VSCodeのprettierの設定
ところがVSCodeのprettier特有の設定もあるんです。めんどくさ!なぜならVSCodeの設定は全部settings.json
ってファイルに書くからです。.prettierrc.js
の中とかにVSCodeの設定も書けると楽なんだけどね。別にperttierはVSCodeのために開発してるわけじゃないしな。
npmのprettierの設定
npmの方には特有の設定ファイルとかはないですが、cliのパラメータとかは当然VSCodeからは参照できないです。--write
とかね。
無視の設定
閑話休題。まとめると「prettierは2種類あるけど設定ファイルが共通(.prettierignore) だからそこにmarkdownを無視する設定を書けば良い」ってことです。
起こる問題
ignoreファイルがなかったら
もし.prettierignore
が無かったら…上記の方法は採れません。markdownを除外する系の方法ではたびたび.prettierignore
を用いますが、ファイルがなければ無理です。
そんなことはあるのか
基本ないですが、prettierはじめフロントエンドのツールは--ignore-path
といってignoreファイルを変更する機能があります。前回の記事とかに書きましたが、この機能を使ってignoreファイルを.gitignore
に統一することができます。この手法は各種ツールのignoreの対象の一括管理することができる反面.prettierignore
が存在しなくなるためVSCodeのprettierが設定を読めなくなります。
VSCodeのprettierにもignorepathを設定
ならVSCodeのprettierにもignorepathを設定し.gitignore
をignoreファイルとして認識させれば良いんですが、VSCodeのprettierに同等の機能は無く、必ず.prettierignoreという名前のファイルを参照する仕様になっています。ちょっとCoC(設定より規約)みたいな思想ですね。
対策
命題は「.prettierignoreを使わずにnpmのprettierとVSCodeのprettierでmarkdownを除外せよ」です。シンプルだね。
npmのprettierでの対策
こう。
prettier '**/!(*.md)' --write --ignore-unknown --ignore-path .gitignore
対象を.md
以外の全てとし、--write
で整形。--ignore-unknown
で整形できないファイルのエラーを無視。あと直接は関係ないけど、--ignore-path
で.gitignore
を指定。
VSCodeのprettierでの対策
settings.json
にこれを追記。
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"[markdown]": {
"editor.formatOnSave": false
}
}
フォーマッターにprettierを設定し、保存を押すたびに実行。ただし、markdownファイルを保存した時のみ実行しない。
最後に
今回の設定はエディタがVSCodeにロックインされます。VSCode以外にプラグインとしてprettierをサポートしているエディタがあると事故ります。気をつけて。
あと、ignoreファイルを一括管理したいための設定なのに結局markdownを無視する設定を2箇所に書いているのは何かの皮肉でしょうか。そこは突っ込んじゃ駄目ですね。以上。