仕様の曖昧さについて

仕様は http://editorconfig.org/#file-format-details だが、いくつか書かれていない暗黙のルールがある。
・セクションに "/" が含まれていない場合、先頭に "**/"がついているとみなす。
 (これがないと[*.js]と書いた場合にサブディレクトリ内のファイルにマッチしない)
・同じファイル内で複数のセクションに該当する場合はあとから設定された値で上書きされる

他にもある気がするが、何が正しいかはコアライブラリの実装を見るしかない。コアライブラリは各言語ごとに用意されているが、言語ごとに微妙に動作が違ったりする(固い仕様がないので当然といえば当然)。どうもPyhton版かC版を正として移植されているような雰囲気。上記のルールはPython版の動作をもとにしている。


独断と偏見のコマンドラインツール選び


普通に使うぶんには、エディタのプラグインを使えばいいのだが、既存プロジェクトの導入時に一括でチェック・修正したりとかCIで使う場合には、コマンドラインツールを使いたい。他にも、既存のファイルからルールを自動生成できると便利。

コマンドラインツールですぐに見つかるのは次の3つ。
https://github.com/jedmao/eclint
https://github.com/treyhunner/editorconfig-tools
https://github.com/slang800/editorconfig-tools

eclintはインデント判定でブロックコメントやヒアドキュメントを認識してくれない(&作者は対応を拒否している)ので使いづらい。言語ごとに手を入れたらキリがないのは分かるが、それでは使い物にならないのでパス。
treyhunner/editorconfig-toolsは、生成機能がない。READMEに"--generate"とかあるけど、あれはただの構想で、欠片すら実装されてない。
slang800/editorconfig-toolsはそこそこ使える。インデントはdetect-indentで判定。100%正確ではなさそうだが、実用的な範囲内では使えそう。

ということで、slang800/editorconfig-toolsを使う予定。

設定の削除

バッチで一括処理する際に、プロジェクト外から来たファイルには手を加えたくない事が多い。
対象ファイルの列挙時に除外する方法と、.editorconfigで除外する方法があるが、後者で行う場合は設定値にunsetを使うとよい。(昔は、"null"などのでたらめな値をいれると、パースできずに処理不能になることを利用して無効化していた模様。今はオフィシャルにunsetが使えることになっている)

が、unsetはslang800/editorconfig-toolsで対応されていない…
→修正するPR送った。