RuboCopとは
RuboCopはRubyファイルを静的解析してソースコード内の問題を報告してくれるLinterと呼ばれるツールです。開発中のシステムのコードを可読性の高い状態に保ったり、チーム開発における記述ルールの統一のために導入するものです。
基本的にはコミット前などに下記の様なコマンドを実行して解析結果を出力して使います。
$ rubocop [ファイル]
今回はこれをaleというVimプラグインを使うことで入力中に非同期でアンチパターンに引っ掛かったコードの警告をしてくれるようにしたいと思います。
RuboCopインストール
まずはaleが実行するLinterとなるRuboCopのGEMを端末にインストールします。自分は開発環境に合わせて若干古いバージョンを指定していますが、皆様は最新バージョンを入れて良いと思います。
$ gem install rubocop -v 0.79.0
$ gem install rubocop-rspec
rubocop-rspec
というGEMもインストールしていますが、これも開発環境で導入していていて環境下の.rubocop.ymlが参照してしまっていたので合わせて導入しました。ご自身のプロジェクト内でrubocop-rspec
を使っていなければインストールする必要は無いと思います。
インストール出来たら試しに汚いもしくはあり得ないコードを書いてから、最初に話したrubocop
コマンドの引数にそのファイル名を渡して実行してみて下さい。しっかり警告されていればLinterの導入は完了です。他のプロジェクトでも使う際にaleが動いてないなーと思ったら、:ALEInfo
しても原因が分からない時がありますがそもそもRuboCopが動作していない可能性も結構高いです。
aleインストール
次にRuboCopを非同期で実行するためのaleというVimプラグインをインストールします。ついでにvim-airline
というVimプラグインもインストールした方が良いです。入れなくても動きますが警告時のステータスラインが見えやすくなります。
※Vimプラグインのインストール方法についてはこちらをご確認下さい。
aleをインストール出来たら.vimrcに下記を追記します。
let g:ale_linters = {
\ 'ruby': ['rubocop'],
\}
let g:ale_linters_explicit = 1
let g:airline#extensions#ale#enabled = 1
まずLinterにrubocopを指定しています。そして指定したlinter以外は実行しないようにしています。これを設定しないとまあまあのCPUを占領してしまいVimが重くなってしまいます。
これで準備は完了です。試しに次の様なRubyコードを書いてみて下さい。
def hoge(arg)
return false if arg ← この行がマークされる
true
end
マークされた行にカーソルを合わせて「Layout/EmptyLineAfterGuardClause: Add empty line after guard clause.」といった、ガード構文の後に空行を挿入しましょう的な警告文がステータスラインに出力されれば成功です。
終わりに
同僚のVsCodeでの非同期ソースコード解析や自動修正をしている画面を見て羨ましく思い今回Vimでの方法をまとめてみました。今まで手打ちでコマンドを打っていたり、プッシュした後のCIツールで気づいていたVimmerは、これで多少開発効率が上がるのではないでしょうか。
本来ならフォーマッターも入れるべきかもしれないのですが、個人的に勝手にコードを修正されるというのが本当に良いことなのかまだ納得出来ておらず、今回はまとめませんでした。そのうち気が変わってまとめるかもしれません。