この記事は 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 を検査してみましょう。
アッアッ…作者なのに…!
私の vimrc は 700 行弱ですが、ほぼ一瞬で検査が終了しています。
定番 lint プラグインの syntastic のような lnit の実行完了を待たせる lint プラグインでも問題にならない速さです。
タイムアタックの結果
さて、タイムアタックの結果です。
9 つのルールのうち、5 つのルールを 5 時間で実装できました。
つまり、おおよそ新規の 1 ルールが 1 時間で実装(テスト込み)できるという計算になります。それぞれのルールにはテストも付属させてます。
- ソースにマルチバイト文字があり、かつ script encoding が指定されていない場合警告
- set encoding が script encoding よりも後に宣言されていた場合、警告
- 省略記法禁止
- augroup 外、かつ autocmd の group が定義されてないとき警告
- set nocompatible を警告
- syntax on は Bundle系コマンドの後に配置(無理そう?)
- スコープのない変数
- Xmap は
<Plug>
と併用していなければ警告 <C-i>
と<Tab>
、<C-m>
と<Enter>
、<C-[>
と<ESC>
の両方の組があらわれたら警告
このように、手軽に lint のルールを追加していけることが vint のよさなのです。
ただ、動作確認は結構雑だったので、もしかすると判定ミスがあるかもしれません。そういうときは issueをたてていただけると対応します。
謝辞
@rbtnnさん、とても勉強になる記事でした。ありがとうございました。
@thincaさん、@itchynyさん、バグ報告ありがとうございました。
まだ大部分を直せていませんが、今後も vint を使用していただけると助かります。
現在は問題の多かったスコープ解析部分を無効化しているため、vital も検査できるようになっています。