👏

エディタにコーディングスタイルを伝えるEditorConfig

に公開

EditorConfigとは

IntelliJでインデントの設定を行おうとしたところ、EditorConfigというファイルで設定を行えるのに気づきました。
見たことのないファイル名だったので気になって調べたところ、.editorconfigというファイルでコーディングスタイルを設定するプロジェクトのようです。
https://editorconfig.org/

vimとIDEで別個に設定しなくてよくなりますし、ファイルなのでgitで管理・共有することもできると思うので、調べてみました。

.editorconfigファイル

.editorconfigの仕様はこちらに載っています。
英語ですが、そんなに量はありません。
https://spec.editorconfig.org/

今回は公式サイトの例から、使えるプロパティを紹介します。
https://editorconfig.org/#example-file

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# Matches multiple files with brace expansion notation
# Set default charset
[*.{js,py}]
charset = utf-8

# 4 space indentation
[*.py]
indent_style = space
indent_size = 4

# Tab indentation (no size specified)
[Makefile]
indent_style = tab

# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2

# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2

ちなみに、Zennのコードブロックでハイライトさせるには、editorconfigと指定することで有効になりました。
普及しつつある仕組みなのですね。

root = true

EditorConfigは、そのファイルに書かれている内容だけでなく、親ディレクトリに存在する.editorconfigファイルも探しに行き、設定を適用します。
root = trueと設定することで、これ以上親ディレクトリへ遡らないように設定されます。
プロジェクト内で設定を厳密にしたい場合は、root = trueと設定しておきます。

[*] [*.{js,py}] Makefile

[]から次の[]までが一つのセクションで、どのファイルに対して適用するかを指定します。
[]の中身はglobで、*や{}などシェルと同じglobがそのまま使えるようです。
https://spec.editorconfig.org/#id10

[*]とすれば全てのファイル、[*.{js,py}]とすればjsファイルもしくはpyファイルに、設定が適用されます。
インデントがタブでなければならないMakefileも、例に載っています。

設定値

公式にサポートされているプロパティはこちらにあります。よく見るプロパティだけで、珍しいものはありません。
https://spec.editorconfig.org/#supported-pairs

後述するJetbrainsのように、独自の設定値も許容されているようです。

設定できる値は前述の一覧を見ていただきたいですが、せっかくなのでいくつか紹介します。

  • indent_style indent_size tab_width
    インデントをスペースにするかタブにするか、またインデントサイズをどうするか、設定できます。
    タブは環境によって表示幅が違うことがあるのでスペースが基本的には好まれると思いますが、前述のMakefileのようにタブが強制されているファイルも存在します。
    いずれにせよ、ファイルタイプによってインデントが統一されていないのは可読性が下がるので、明示的に設定しておきたい項目です。
  • insert_final_newline
    ファイル保存時に、ファイルの最後に空行が一行存在するようにします。
    デフォルトはfalseで、有効にするには明示的にtrueにする必要があります。
    gitなどのバージョン管理システムで差分を表示する際に、末尾に空行があると差分を綺麗に表示できます。
    基本的には全てのファイルで有効化しておくと良いでしょう。

サポートされているエディタ

Jetbrains

IntelliJを含むJetbrains製のIDEには、.editorconfigファイルを作成してくれる機能がありました。

IntelliJ IDEAでEditorConfigを作成するウィザード
画像の設定で出力した結果がこちらです。

root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
max_line_length = 120
tab_width = 4
ij_continuation_indent_size = 8
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = true
ij_smart_tabs = false
ij_visual_guides = 
ij_wrap_on_typing = false

ij_というプレフィックスのものは独自拡張のようですね。
大体のフォーマット設定は書けるようです。
https://www.jetbrains.com/help/idea/editorconfig.html

.editorconfigファイル内でij_と入力すれば、オプション名のコード補完もしてくれました。

公式プラグインがあるもの

EditorConfigのGitHubに、vimやvscodeの公式プラグインが用意されています。
https://github.com/editorconfig

まとめ

EditorConfigの紹介でした。
プロジェクト内でコーディングスタイルを共通化するのに便利そうですし、dotfileとして管理することで複数の端末で共通の設定を使うこともできそうです。

株式会社サイバーセキュリティクラウド テックブログ

Discussion