CTOになるまで続けるブログ

My daily personal tech notes

Lint with Atom

Atom でコーディングスタイルをチェックするための方法および一連の仕組みと、 スタイルチェックプラグインとしてデファクトスタンダードな linter(という名前の)プラグインについて、 俯瞰で理解する。

Atom のスタイルチェック

Atom はシンプルなエディタとして設計されているので、 一般的な IDE のようなスタイルチェック機能はデフォルトでは実装されていない。

ただし、Atom の提供する柔軟なプラグイン機構に基づいて、 スタイルチェック機能を提供する複数のプラグインがサードパーティより提供されていて、これを導入することで、スタイルチェック機能を Atom に載せることが出来る。

多くのスタイルチェックプラグインは、ファイルの保存時にスタイルチェックを適用するようになっていて、 スタイルのルールに関する違反が見つかった場合には、これを Atom の UI を通して報告する。

プラグインごとに対応するコード(言語やフォーマット)やスタイルルールが違っているので、 ユーザは導入に際してプラグインの機能をよく理解するとともに、 どういったルールが自身のコーディングスタイルや環境(所属するプロジェクトなど)に合っているかを考えて、 場合によってはルールを選択する(※1)といったことが必要になる。

  • ※1: 多くのスタイルチェックプラグインは、設定項目として特定のルールのみを適用、もしくは除外する機能を提供している。

linter プラグイン

Atom のスタイルチェックまわりは良くできていて、それのベースを提供しているのが linter プラグインである。 steelbrain さんという Epic Games 所属(※1)のエンジニアによって提供されているもので、 Atom のスタイルチェックにおいて、実質的なデフォルトスタンダードのプラグインとなっている。

仕組みとしては、linter プラグインはプラットフォームとしての機能のみを提供していて、 具体的には、スタイルチェックのトリガー監視やエラー報告の仕組みを提供している。 実際にスタイルチェックを走らせるには、対応する言語のプラグイン(※2)をインストールする。 linter プラグインが実質的なデフォルトスタンダードとなっていることもあって、豊富なプラグインが多くの開発者によって提供されている。 プラグインは linter-xxx という名前で提供されていて、Atom のプラグインインストール画面から検索かければすぐに見つかるだろう。 また、http://atomlinter.github.io/ では、言語/フォーマット別に linter-xxx プラグインがリストアップされている。

プラットフォームが同じというところで、どの言語のスタイルチェックを利用する場合にも、操作性および視覚的な部分で統一されるので、非常に快適。 また、linter-xxx プラグインには珍しい言語に対応するものもあり、第三者が言語対応部分を拡張できるようにした仕組みが、こういった部分でも活きているものと思われる。

linter プラグインのデメリットについても触れておくと、まず linter プラグイン自体の学習コストがかかること。 調べればすぐわかるものだが、何も考えずに導入とはいかないので、初心者にはとっつきづらいだろうと思う。 あと、環境構築が若干わずらわしい。 例えば、ひとつのフォーマットのスタイルチェックをやるにも最低でも2つのプラグイン(linter プラグインと linter-xxx プラグイン)をインストールしないといけない。(※3)

ちなみに linter-xxx プラグインは、AtomLinter と呼ばれる団体?によって取りまとめられている。 この団体の素性がよくわからなくて、特に記載がみつからないところから、非公式なコミュニティなのではと推測している。

  • ※1: steelbrain さんが Epic Games 所属というのは、GitHub アカウントのプロフィールから推測した。
  • ※2: linter プラグインは、こういった linter 上で動くプラグインのことを provider と定義している。ただし、直観的にわかりづらい気がするので、本エントリでは通して linter-xxx プラグインと呼ぶことにする。
  • ※3: でも linter-xxx だけインストールすれば、依存性で linter もインストールされるのか。

linter プラグインの依存プラグイン

linter プラグインをインストールすると、依存性の解決でぽろぽろとプラグインが落ちてくる。

  • linter-ui-default
  • intentions
  • busy-signal

linter-ui-default は UI を提供するプラグイン。 互換性のあるプラグインを入れることで、UI の変更および拡張が可能である。(※1)

また、intentions は、サジェストのための小さい窓を出す API を提供するプラグイン、busy-signal は、進捗を表す “ぐるぐる” 回る UI をステータスバーに出す API を提供するだけのプラグインである。 こういったプラグイン展開を見る限り、どうやら steelbrain さんは、実装を小さい部品に分けるのが好きなようだ。

最後に大事なこととして、linter プラグインが依存していることを忘れて、これらのプラグインを disable にしてしまうと、該当する機能が動作しなくなるので気をつけること。

  • ※1: 肝心の互換性のあるプラグインが linter-ui-plus しか存在せず、linter-ui-plus 自体もアルファリリースで未完成のため、実質 linter-ui-default しか選択肢はない。

linter 以外のスタイルチェックプラグイン

色々すっとばして linter プラグインの紹介をしてしまったので、補足として linter 以外のプラグインについても、調査結果を残しておく。 linter 以外のプラグインで見つけたものは、Atom-Lint と Nuclide の2つ。

Atom-Lint (atom-lint)。 linter プラグインと名前が似ているが別物。 複数のプログラミング言語をサポートしているので、これさえ入れればサポート対象の言語の lint を全て一任できる。 メジャーなプログラミング言語が抑えられているので、割と使えるかも。 https://atom.io/packages/atom-lint

Nuclide (nuclide)。 Facebook 製のプラグインで、Atom の IDE 化をうたったもの。 特筆すべき機能が見当たらないのと、IDE が使いたいなら Eclipse や IntelliJ をあたった方が早い気がする。 https://atom.io/packages/Nuclide