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 のサポート状況
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.