Vimのすゝめ改

第1回 EditorConfig

2019.03.12

Vim 使いの「ブイ」(仮名)です。Vim のすゝめ改では、現代のテキストエディタについて Vim の視点から見た話をしようと思います。

今回のテーマは EditorConfig です。

1 EditorConfig とは?

EditorConfig はプロジェクト全体でファイルフォーマットを統一するための設定ファイルのことです。

例えば以下のように記述します。

[*.py]
indent_style = space
indent_size = 4

これは Python スクリプトをスペースでインデントし、インデントのサイズは 4 とするものです。

フォーマットを統一するための機能ということで Vim の機能の modeline に似ていますが、EditorConfig は以下の違いがあります。

  • EditorConfig ファイルはプロジェクト毎に一つ用意する。全てのファイルに個別に設定する必要がない

  • modeline は Vim 専用だが、EditorConfig の設定ファイルはテキストエディタに依存しない

  • modeline は新規ファイルには効果がないが、EditorConfig はファイルを新規作成したときにも有効になる

EditorConfig はテキストエディタに依存しないというのは一つのポイントです。 現代では開発環境の統一というのは難しく、人によって様々なテキストエディタを用いて開発するようになっています。その場合、どのエディタでも解釈できる設定ファイルによりファイルフォーマットを統一することは必要不可欠です。

2 Vim/neovim における EditorConfig の利用

EditorConfig は一部の OSS の開発でも利用されています。私が確認したところ、neovim は EditorConfig の設定ファイルを用意しており、簡単にフォーマットを統一できるように配慮されています。

https://github.com/neovim/neovim/blob/master/.editorconfig

neovim の EditorConfig 設定は以下の通りです。

root  =  true

[*]
indent_style  =  space
indent_size  =  2
tab_width  =  8
end_of_line  =  lf
insert_final_newline  =  true
charset  =  utf-8

[{Makefile, **/Makefile, runtime/doc/*.txt}]
indent_style  =  tab
indent_size  =  8

Vim のソースコードも調べてみましたが、Vim は従来通りの modeline を用いてフォーマットを統一する方針のようです。

https://github.com/vim/vim/blob/4f97475d326c2773a78561fb874e4f23c25cbcd9/src/eval.c#1

/* vi:set ts=8 sts=4 sw=4 noet:
 *
 * VIM - Vi IMproved    by Bram Moolenaar
 *
 * Do ":help uganda"  in Vim to read copying and usage conditions.
 * Do ":help credits" in Vim to see a list of people who contributed.
 * See README.txt for an overview of the Vim source code.
 */

neovim の各ソースコードを確認したところ、neovim は Vim とは異なりソースコード中の modeline は完全に排除されています。EditorConfig を利用するという方針なのでしょう。

3 テキストエディタにおける EditorConfig のサポート状況

https://editorconfig.org/

Editorconfig の公式サイトによると、EditorConfig は以下のテキストエディタでサポートされています。

  • IntelliJ IDEA

  • PyCharm

  • RubyMine

  • VisualStudio

  • Kakoune

  • KTextEditor

  • Visual Studio

...

以下のテキストエディタでは外部プラグインを導入することで、EditorConfig への対応が可能です。

  • Atom

  • Brackets

  • Eclipse

  • Emacs

  • gedit

  • NetBeans

  • notepad++

  • PhpStorm

  • Sublime Text

  • TextMate

  • Vim

  • VisualStudio Code

...

こうして見ると、EditorConfig をサポートするテキストエディタは少数派で、外部プラグインが必要になる場合が多いようです。

ただし、あの Visual Studio が標準で EditorConfig をサポートしているということには驚きます。

4 EditorConfig の例

EditorConfig は .editorconfig ファイルで定義します。その中身は以下のようなものになるようです。

https://editorconfig.org/#example-file

[*]
# 全てのファイルに対する設定
charset = utf-8

[*.py]
# 特定のファイルに対する設定
indent_style = space
indent_size = 4

EditorConfig の文法は以下で解説されています。

https://editorconfig.org/#file-format-details

EditorConfig における代表的なプロパティは次の通りです。

プロパティ 解説
indent_style インデントをタブで記述するかスペースで記述するか
indent_width インデントの幅
tab_width タブの幅
end_of_line 改行コード
charset 文字コード
trim_trailing_whitespace 行末のスペースを削除するか
insert_final_newline 最終行に改行を入れるか
root true である場合、EditorConfig の設定ファイルの探索をここで終える

EditorConfig のサポート状況はプラグインによって異なります。更に、一部の EditorConfig プラグインは独自のプロパティを追加しています。互換性問題にも注意を払う必要があるかもしれません。

例えば、ソースコードにおける行の幅を指定する max_line_length プロパティは EditorConfig をサポートする全てのテキストエディタでサポートされているわけではありません。

5 Vim における EditorConfig の利用

Vim で EditorConfig を利用するためには外部プラグインを導入する必要があります。 現在 Vim 用の EditorConfig プラグインは二種類あります。

https://github.com/editorconfig/editorconfig-vim

https://github.com/sgur/vim-editorconfig

editorconfig-vim は EditorConfig 公式の Vim 用プラグインです。 if_python/if_python3 の機能を用いて実装されているので、利用するには Vim のif_python/if_python3 を有効にする必要があります。

vim-editorconfig は非公式のものですが、Vim script で記述されており他のものに依存しません。vim-editorconfig は editorconfig-vim のサポートする EditorConfig プロパティを全てサポートし、更に独自のプロパティ c_include_path, spell_enabled, spell_language を追加しています。

どちらがよいかは完全に好みの問題ですが、個人的には依存の少ない vim-editorconfigのほうが良いのではないかと考えています。

6 Vim/neovim における EditorConfig の同梱についての議論

EditorConfig プラグインを Vim に同梱して標準で使えるようにしてほしいという要望が以前ありました。

https://github.com/vim/vim/issues/2286

Bram 氏は editorconfig-vim の実装が autoload を使っていないこと、全ての環境で使えるわけではない if_python/if_python3 を利用していることを指摘して難色を示しています。

if_python/if_python3 に依存しない vim-editorconfig を同梱することについては話がある程度進んでいるようですが、2019年の 2 月現在も Vim 本体に同梱されるに至っていません。

neovim の方も確認したところ、EditorConfig をサポートしてほしいという似たような要望が上がっていました。

https://github.com/neovim/neovim/issues/3988

しかし、neovim のほうでは誰がメンテナンスをするのかという理由で難色が示されています。Vim のほうで本体に EditorConfig 用のプラグインが同梱された場合は、neovim でも標準的に同梱される未来はあるかもしれません。

EditorConfig を使うからといって、modeline のときに問題になったようなセキュリティ問題が無関係になるわけではありません。EditorConfig プラグインはちゃんと実装しないと以下のように任意の Vim script を実行される恐れがあるので注意しないといけません。

https://github.com/sgur/vim-editorconfig/issues/30

セキュリティ問題への懸念や保守の問題を考えると、テキストエディタ側が難色を示すのは仕方ないのだろうと思います。

This article is made by Vim.

著者プロフィール

v

ブイ。社内では数少ない Vim 使い。ブログ記事の執筆により、社内でのVim の知名度を上げ、Vim を使用する人を増やそうと計画しているらしい。

記事一覧Index