vimrc アンチパターンを自動でチェックする

  • 84
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

この記事は Vim Advent Calendar 2014 の 16 日目の記事です。
15日は kefir_ さんの「vim と term.c」でした。vim と 端末の間のやりとりの解説という超ディープな話題で、つくづく vimmer は変態(いい意味)が多いな、と痛感させられます。素晴らしい記事ですので、ぜひ一読をお勧めします。

さて、今回の記事では、VAC 1 日目の記事 「vimrc アンチパターン」 を Vim script の lint ツール「vint」で判定できるようにした、という話を紹介します。

今年 11 月に開かれた VimConf 2014 にて「vint は機能追加が簡単さ〜」とか豪語しておりましたので、その実証がてら lint ルールの実装タイムアタックにチャレンジしてみました。

vimrc アンチパターンのルール

vimrc アンチパターンをまとめると、9 つのルールなります。
この 9 つのルールをどれくらいの時間で実装できるかを計測してみました。

  • コード中にマルチバイト文字があり、かつ scriptencoding が指定されていない場合警告
  • encoding が scriptencoding よりも後に指定されていた場合、警告
  • オプションの省略記法を検知して警告
  • autocmd が augroup の外で、さらに group が指定されてないとき警告
  • set nocompatible を警告
  • syntax on が Bundle系コマンドの前にある場合警告
  • スコーププレフィックス(g: とか a: とか)のない変数を警告
  • remap じゃない map は <Plug> と併用されていなければ警告
  • <C-i><Tab><C-m><Enter><C-[><ESC> の両方の組があらわれたら警告

vint の使い方

python で実装されているため、 pip を使います。

pip install vim-vint

インストールが終われば、vint ファイル名 で実行できるようになります。
さっそく自分の vimrc を検査してみましょう。

screencast

アッアッ…作者なのに…!

私の vimrc は 700 行弱ですが、ほぼ一瞬で検査が終了しています。
定番 lint プラグインの syntastic のような lnit の実行完了を待たせる lint プラグインでも問題にならない速さです。

タイムアタックの結果

さて、タイムアタックの結果です。

9 つのルールのうち、5 つのルールを 5 時間で実装できました。

つまり、おおよそ新規の 1 ルールが 1 時間で実装(テスト込み)できるという計算になります。それぞれのルールにはテストも付属させてます。

このように、手軽に lint のルールを追加していけることが vint のよさなのです。
ただ、動作確認は結構雑だったので、もしかすると判定ミスがあるかもしれません。そういうときは issue をたてていただけると対応します。

謝辞

@rbtnn さん、とても勉強になる記事でした。ありがとうございました。
@thinca さん、@itchyny さん、バグ報告ありがとうございました。
まだ大部分を直せていませんが、今後も vint を使用していただけると助かります。
現在は問題の多かったスコープ解析部分を無効化しているため、vital も検査できるようになっています。

この投稿は Vim Advent Calendar 201416日目の記事です。