本文へスキップ
AZ Tools

EditorConfig テスター

.editorconfig は上から下へ読む設定ではなく、対象ファイルから上のディレクトリへさかのぼって読む設定です。ソースファイルとディスク ルートの間にあるどのディレクトリにも置くことができ、探索が止まるのは冒頭に root = true と書かれたファイルだけです。プロパティごとに 最も近いファイルが勝ち、1つのファイルの中では最後に一致したセクションが勝ちます。CSS のような詳細度の概念はありません。「なぜこのファイルは半角4つになるのか」の答えが、いま見ている行に書かれていない理由がここにあります。 このツールは設定ファイル(複数ある場合は「# path: src/.editorconfig」という目印の行で区切ります)とファイルパスの一覧を受け取り、パスごとに最終的なプロパティ集合と、各値を生んだファイル・行番号・セクションのグロブ、上へたどる途中で参照した設定ファイルの順序、そして root = true がその連鎖を断ち切った位置を表示します。 グロブの規則は fnmatch でも gitignore でもありません。* はスラッシュで止まり ** は越えます。? はスラッシュ以外の1文字です。[abc] と [!abc] は文字クラスですが、中にスラッシュが入った瞬間にクラスではなくなります。{js,ts} は選択ですが、カンマのない {js} は その3文字そのものを表し、{1..10} は負数を含む整数の範囲で、先頭に 0 が付くと一致しません。そして最も誤解されるのが次の規則です。末尾以外にスラッシュを1つでも含むグロブは、その .editorconfig があるディレクトリを基準に固定されます。スラッシュを含まないグロブは、深さに関係なくファイル名だけを見ます。 結果に並ぶ値のうち3つは、どのファイルにも書かれていないことがよくあります。indent_style が tab でサイズ未指定なら indent_size は tab になり、indent_size が数値で tab_width が未指定なら tab_width がその数値を複製し、indent_size が tab で tab_width があれば indent_size がその数値を受け取ります。いずれも統合後に適用されるため、ルートの tab_width が3階層下で書いた indent_size に混ざる こともあります。 指摘パネルは、設定ファイル自身が教えてくれない問題を名指しします。どのパスにも一致しないセクション、書いてあるのに常に負ける値、indent_style のない indent_size、空白が一致対象に入ってしまう {js, ts}、重複したセクション名、標準9項目にないキー、そのプロパティが受け付けない値、最初のセクションより前にあって黙って捨てられるプロパティ、そしてホームディレクトリの .editorconfig まで生かしてしまう root = true の欠落です。 分からないこともあります。エディタが実際にこの通り動くかはプラグイン次第で、max_line_length や一部の charset 値は無視されがちです。unset は値を取り消す指示としてプラグインへそのまま渡されます。「一致なし」も貼り付けた一覧の中での話なので、代表的なパスを添えてください。処理はすべてブラウザ内で完結し、ファイルは送信されません。

設定ファイル

2

セクション

6

パス

8

指摘

1

src/app.js

探索の順序: .editorconfig · root = true で停止

プロパティ設定した場所
charsetutf-8.editorconfig:4 [*]
end_of_linelf.editorconfig:5 [*]
indent_size2.editorconfig:8 [*]
indent_stylespace.editorconfig:7 [*]
insert_final_newlinetrue.editorconfig:6 [*]
tab_width2導出値 — どのファイルにも書かれていません.editorconfig:8 [*]tab_width がないので indent_size の値をそのまま複製
lib/util.js

探索の順序: .editorconfig · root = true で停止

プロパティ設定した場所
charsetutf-8.editorconfig:4 [*]
end_of_linelf.editorconfig:5 [*]
indent_size4.editorconfig:20 [lib/**.js]上書きした設定 .editorconfig:8
indent_stylespace.editorconfig:7 [*]
insert_final_newlinetrue.editorconfig:6 [*]
tab_width4導出値 — どのファイルにも書かれていません.editorconfig:20 [lib/**.js]tab_width がないので indent_size の値をそのまま複製
lib/deep/util.min.js

探索の順序: .editorconfig · root = true で停止

プロパティ設定した場所
charsetutf-8.editorconfig:4 [*]
end_of_linelf.editorconfig:5 [*]
indent_size4.editorconfig:20 [lib/**.js]上書きした設定 .editorconfig:8
indent_stylespace.editorconfig:7 [*]
insert_final_newlinetrue.editorconfig:6 [*]
tab_width4導出値 — どのファイルにも書かれていません.editorconfig:20 [lib/**.js]tab_width がないので indent_size の値をそのまま複製
main.py

探索の順序: .editorconfig · root = true で停止

プロパティ設定した場所
charsetutf-8.editorconfig:4 [*]
end_of_linelf.editorconfig:5 [*]
indent_size4.editorconfig:11 [*.{py,rs}]上書きした設定 .editorconfig:8
indent_stylespace.editorconfig:7 [*]
insert_final_newlinetrue.editorconfig:6 [*]
tab_width4導出値 — どのファイルにも書かれていません.editorconfig:11 [*.{py,rs}]tab_width がないので indent_size の値をそのまま複製
Makefile

探索の順序: .editorconfig · root = true で停止

プロパティ設定した場所
charsetutf-8.editorconfig:4 [*]
end_of_linelf.editorconfig:5 [*]
indent_size2.editorconfig:8 [*]
indent_styletab.editorconfig:17 [Makefile]上書きした設定 .editorconfig:7
insert_final_newlinetrue.editorconfig:6 [*]
tab_width2導出値 — どのファイルにも書かれていません.editorconfig:8 [*]tab_width がないので indent_size の値をそのまま複製
docs/guide.md

探索の順序: .editorconfig · root = true で停止

プロパティ設定した場所
charsetutf-8.editorconfig:4 [*]
end_of_linelf.editorconfig:5 [*]
indent_size2.editorconfig:8 [*]
indent_stylespace.editorconfig:7 [*]
insert_final_newlinetrue.editorconfig:6 [*]
tab_width2導出値 — どのファイルにも書かれていません.editorconfig:8 [*]tab_width がないので indent_size の値をそのまま複製
trim_trailing_whitespacefalse.editorconfig:14 [*.{md, txt}]
notes.txt

探索の順序: .editorconfig · root = true で停止

プロパティ設定した場所
charsetutf-8.editorconfig:4 [*]
end_of_linelf.editorconfig:5 [*]
indent_size2.editorconfig:8 [*]
indent_stylespace.editorconfig:7 [*]
insert_final_newlinetrue.editorconfig:6 [*]
tab_width2導出値 — どのファイルにも書かれていません.editorconfig:8 [*]tab_width がないので indent_size の値をそのまま複製
vendor/jquery.js

探索の順序: vendor/.editorconfig → .editorconfig · root = true で停止

プロパティ設定した場所
charsetutf-8.editorconfig:4 [*]
end_of_linelf.editorconfig:5 [*]
indent_size2.editorconfig:8 [*]
indent_styletabvendor/.editorconfig:2 [*]上書きした設定 .editorconfig:7
insert_final_newlinetrue.editorconfig:6 [*]
tab_width4vendor/.editorconfig:3 [*]
trim_trailing_whitespacefalsevendor/.editorconfig:4 [*]
指摘

各行は、ファイルが見た目どおりに動かない箇所です。

  • .editorconfig:13 — 波かっこ内の空白は一致対象の文字列の一部になります: [*.{md, txt}]

editorconfig-core と同じ解決順で、セクション名は大文字小文字を区別します。送信は行いません。

使い方

  1. 1つ目の入力欄に .editorconfig を貼り付けます。複数ある場合は「# path: vendor/.editorconfig」のような目印の行で区切り、プロジェクトルートのファイルを先頭に置きます。
  2. 2つ目の入力欄に判定したいパスを1行に1つ書きます。最上位の .editorconfig があるプロジェクトルートからの相対パスです。
  3. パスごとの表を読みます。プロパティ、最終的な値、そしてそれを設定したファイル・行・セクションのグロブが並びます。導出値と書かれた行はどのファイルにも書かれておらず、どの規則で生まれたかが併記されます。
  4. 表の上の探索順序を確認します。近い順に参照した .editorconfig と、root = true で止まったのか、プロジェクトより上へ続くのかが分かります。
  5. 指摘パネルを順に見ます。死んだセクション、決して勝たない設定、波かっこ内の空白など、見た目どおりに動かない箇所をファイルと行番号で示します。

よくある質問

[*] に2と書いたのに、なぜ半角4つになるのですか。
後ろにある設定か、より近い設定が勝ったからです。EditorConfig には CSS のような詳細度がありません。1つのファイルの中では最後に一致したセクションが勝つので、[*] ブロックの20行下にある [*.py] ブロックが静かに上書きします。同じ名前の [*] がもう一度出てくる場合も同じで、だからセクション名の重複が問題になります。ファイル同士ではプロパティごとに最も近い .editorconfig が勝つため、編集中のディレクトリにある2行の設定が、ルートの丁寧な設定に勝ちます。順序と距離がすべてで、「設定した場所」の列が値を生んだファイル・行・セクションのグロブと、それが退けた設定まで示します。
[*.js]、[lib/*.js]、[**/*.js] は何が違うのですか。
違いはスラッシュの有無だけです。スラッシュを含まないグロブは深さに関係なくファイル名だけを見るので、[*.js] は src/a.js も vendor/dist/b.js も対象にします。末尾以外にスラッシュが1つでもあると、その .editorconfig のディレクトリに固定され、[lib/*.js] は lib/a.js だけに一致し、lib/sub/a.js にも src/lib/a.js にも一致しません。[**/*.js] は固定されつつディレクトリを越える形です。* はスラッシュで止まりますが ** は越え、途中の /**/ はディレクトリが1つもない場合も表すので、a.js と lib/sub/a.js の両方に一致します。最後の落とし穴として、[lib/] のように末尾がスラッシュのグロブは何にも一致しません。ファイルパスはスラッシュで終わらないからで、配下全体は [lib/**] と書きます。
書いた覚えのない indent_size = tab や tab_width はどこから来たのですか。
統合後にコアが適用する補完規則からです。indent_style が tab で indent_size が未設定なら indent_size は tab になります。indent_size が数値で tab_width が未設定なら tab_width がその値を複製するので、indent_size しか書いていないファイルでも tab_width が併せて報告されます。逆に indent_size が tab で tab_width があれば、indent_size がその数値を受け取ります。統合結果に対して働くため、2つの断片が別々のファイル由来になることがあります。unset も同じ経路を通るので、indent_size = unset なら tab_width も unset になります。
root = true は具体的に何を止めるのですか。
.editorconfig をさらに探しに上へ行く動きを止めます。この行がないと探索はプロジェクトで終わらず、親ディレクトリ、ホームディレクトリ、ファイルシステムのルートまで続き、そこで見つかった設定が自分のファイルで決めなかったプロパティを埋めます。効かせるには2点が必要です。最初のセクション見出しより前、つまり冒頭に置くこと。[*] ブロックの中に書くと root という名前の普通のプロパティにすぎず、何も止めません。またそのファイルのセクションが1つも一致しなくても root = true は読まれるので、セクションが全部外れた設定ファイルでも探索は終わります。
[*.{js, ts}] が .ts ファイルに適用されないのはなぜですか。
空白がパターンの一部だからです。波かっこの選択はカンマの間の文字列をそのまま比較し、セクション見出しでは空白の除去を一切行いません。つまり {js, ts} が示す候補は "js" と " ts" で、名前に実際に空白を含むファイルだけが2つ目に一致します。同種の落とし穴があと2つあります。カンマのない {js} は選択ではなく {js} という3文字そのものなので、[*.{js}] は app.{js} という名前のファイルにしか適用されません。また {1..10} のような数値範囲は先頭の 0 を拒むので、1.txt と 10.txt は一致し 01.txt は一致しません。
バックスラッシュで * をエスケープできますか。
文書の説明に反して、参照実装ではできません。コアはグロブを一度に正規表現へ変換しますが、エスケープが実際に効くのはカンマ、閉じ波かっこ、#、; だけです。いずれも、そのままではパターンを終わらせたり選択を区切ったりする文字です。* や ? の前のバックスラッシュは捨てられワイルドカードが残るため、[a\*b.txt] は aXb.txt にも一致します。さらに \[ と \{ は生成される正規式のかっこの対応を壊し、コンパイル自体が失敗します。エディタのプラグインはたいてい何も言わずに .editorconfig 全体を無視します。このツールは推測せずそれを再現し、該当セクションを使えないグロブとして報告します。実務的には、セクション名に波かっこ・角かっこ・アスタリスクを入れないのが正解です。

関連ツール