読者です 読者をやめる 読者になる 読者になる

Blank File

LinuxとかPythonとかVimとか、趣味でいじる感じで

気づいたらDartの構文チェック用Vimプラグインを作っていた

Vim Dart

しばらく前に書店でプログラミング言語Dart という書籍を目にし、Google製のaltJS、Dartに手を出してみました。ちらっと見ただけで馴染みやすそうな文法に魅力を感じたからです。感覚としては人間にやさしいJava。文法だけ見るとJavaScript感は弱いと思います。

Dartを書いてみる

さて、新しい言語に手を出すためにはその言語を書く環境を用意しなくてはなりません。 Dart専用のエディター(Dart Editor)やEclipse用のプラグインをが提供されていますので、それらを使うのがおそらく最も手軽にDartに手を出す方法でしょう。

試しにDartEditorを使って100行程度のJSのコードをdartに書き換えてみた所、エラーチェックや型情報に基づいた補完などかなり賢くサポートしてくれました。 見た目もIDEとは異なりそれなりにオシャレ感ありますし、動作もIDEとは異なりそれなりに軽快でした。

しかしながら、私には耐え難い不満点がありました・・・Vimではなかったのです。

VimDartを書いてみる

ということでvimDart用の設定をしました。以下、使ったプラグインです。

構文チェックはsyntasticを使うことでファイル保存時などにDart SDKのdartanalyzerが実行されてエラー箇所がハイライトされます。 このdartanalyzerがかなり賢く構文のチェックをしてくれます。 ちゃんと型情報も使ってくれて素晴らしいです。 ※ ただしJVM上で実行されます

したがって構文チェック時に毎回数秒待たされます。つらすぎます。 公式でもIssue 10981 - dart - dartanalyzer is too slow.というIssueがたてられるほどdartanalyzer (の起動) は遅いです。

Dartの構文チェック用プラグインを作った

つらすぎたので自分で高速かつリアルタイムなDartの構文チェック用のvim pluginを作りました。 名前は、かなり迷った結果、安直にvim-dartanalyzerとしました。 将来ちゃんとしたプラグインを作る人が困りそうですが、多分その人はオシャレな名前を考えてくれると信じています、ごめんなさい。

正直、プラグインがそれなりに動いた時点で「あれ?なんでDart用のVimプラグイン書いてるんだろう?」とふと冷静になってしまい、これ以上モチベーションが続きそうにないのでとりあえず公開することにしました。全体的に自分の環境で動けばいいや的なコードが多いので、試す方は自己責任でお願いします。

[2014/10/09 追記]

vim-dartanalyzerの使い方にインストール方法や使い方を詳しく書きました。

インストール

  • vimproc.vimが必要です
  • 構文チェックにはdartanalyzerを使うので、dartanalyzerにパスが通っている必要があります
  • Vimmatchadd関数をサポートしているバージョンである必要があります
    • 7.4以上なら大丈夫なはず

以上の条件を満たせばLinuxでは動作する思います。 動作確認は Ubuntu 14.04 + Vim 7.4.442 で行っています。 Macでも動作する可能性は高いです。 Windowsは・・・一応動くと思いますが色々不具合あると思います(未確認)。

NeoBundleを使っている方は、

NeoBundle 'miyakogi/vim-dartanalyzer'

.vimrcに書いて:NeoBundleInstallすればインストールできるはずです。

使い方

filetype=dartなファイルを開きます。 自動でfiletypeが設定されない場合は、dart-lang/dart-vim-plugin等を利用するか、.vimrcに適切な設定 (autocmd BufNewFile,BufRead *.dart set filetype=dartなど) を書いてください。

数秒程度待つと、構文チェックが行われ、エラーがあればそこがハイライトされます。

f:id:h-miyako:20140915025324g:plain

エラー箇所はlocation-listにセットしていますので、:lopenでエラー一覧を確認してジャンプすることも可能です。

このプラグインを作るにあたり、vital.vimというライブラリに含まれているProcessManager(PM)というモジュールを使わせていただきました。 モジュールの詳細はこちら。 要は外部プロセスを立ち上げたままにしてvimからのアクセスをいい感じにしてくれます。 これを利用してdartanalyzerを立ち上げたままにして構文チェックをしています。 むしろPMを使ってみたくてこのプラグイン作った部分もあります・・・

VimDartを書いてみた感想

構文チェックができるようになったので、型をつけることで単純なミスによるエラーは実行前に把握できるようになりました。 Javaのような静的型付け言語には苦手意識がありましたが、こんな風に実行前にエラーが修正できる部分が増えるのは便利ですね。

ただ、オムニ補完が利用できないのはかなり寂しいです。 せっかく型をつけているのに、その恩恵を十分得られていない気がします。

なので、オムニ補完プラグインもあるとVimDartを書く環境はかなり改善されるのではないかと思いました。 EclipseDartプラグイン+Eclimも考えましたが、まだ対応していないようでした。 Javaわからない私にはEclimを拡張するとか全然無理です。 誰かDartの補完プラグイン作ってください・・・

余談

Vimスクリプトを書いた時間 >>>>>>> プラグイン名を考えた時間 >> スクショを作った時間 >= Dartのコードを書いた時間

新しい言語に手を出そうとしたらVimスクリプトに少し詳しくなりました。