仕事で Rubyのバッチ処理を書かなければならず、Neovim上で開発環境を
整えてみました。
NeovimからRubyの言語リファレンスを参照する
そもそも、真面目に Ruby を仕事で書くのは初めてなので、言語リファレンス
が編集環境から参照できると便利なので整備してみました。
Rubyの言語リファレンスは refe2 という日本語で提供されてるリファレンスが
あります。
導入方法は、gem の環境が導入されて入れば以下の通りです。
$ gem install refe2 # refe2のインストール
$ bitclust setup # refeのセットアップ
$ refe Array push # 試しにArray#pushのリファレンスを表示
Array#push
--- push(*obj) -> self
指定された obj を順番に配列の末尾に追加します。
引数を指定しなければ何もしません。
うまく動いているようなので、Neovimから参照できるようプラグインを導入します。
私はプラグイン・マネージャーにdeinを使っているので、以下の通りです。
[[plugins]]
repo = 'thinca/vim-ref'
Neovimからは、コマンドモードで、 :Ref refe Array push などとやると画面
が分割されてリファレンスが参照できるようになります。

vim-ref
Neovimから非同期で静的テスト
Ruby の静的テスト、インスペクションツールと言えば Rubocupです。
Rubocop 自体は gemでインストールできます。まとめて、Rakeタスクを
設定して bundle exec rake rubocop で全体を検証できるようにして
いますが、コーディング時にも検証できた方が便利です。
これには、Vim のプラグインで
Asynchronous Lint Engine (以下、ALE)を使用します。
ALE は予め多くの言語とそのチェックツールに対応しており、 Ruby/Rubocop も
標準で組み込まれているので、導入するだけでチェックを有効にできます。
# --------------------------------------------
# ALE
# Asynchronous Lint Engine
# 非同期コードチェック
# --------------------------------------------
[[plugins]]
repo = 'w0rp/ale'
hook_add = '''
let g:ale_sign_column_always = 1
let g:ale_sign_error = '>>'
let g:ale_sign_warning = '--'
'''
導入すると、非同期でRubocopを実行してくれるので、コードを書いていくと
次々とチェックして指摘を表示してくれます。指摘は行頭にマークをつける
ことで示され、カーソルを合わせるとコマンドライン下部にエラー内容を表示してくれ
ます。

Asynchronous Lint Engine
ほぼリアルタイムに検証してくれるので、書きながら都度修正を加えていくことができ
るため、非常に生産性が上がります。
Vimでリファクタリングのサポート
Ruby で Rubocop をかけていると、コード改善のためにリファクタリングが必要と
なってくる場合があります。RubyMineのような統合開発環境を使っていると
リファクタリングの支援機能がありますが、同様な機能を提供する
vim-ruby-refactoring
を導入してみました。
導入は例によって dein を使って遅延読み込みの設定で導入しました。
# --------------------------------------------
# Ruby Refactoring
# --------------------------------------------
[[plugins]]
repo = 'ecomba/vim-ruby-refactoring'
on_ft = 'ruby'
いくつかの機能が用意されていますが、私が使うのは以下のものだけです。
Convert Post Conditional
Rubocop では 一行の条件であれば ifブロックでなく一行にまとめろと指摘されます。
これを :RConvertPostConditional とタイプするだけで自動的に変換してくれます
# ダメな例
if conditional
do_something
end
# 改善した例
do_something if conditional
まとめ
上記で紹介したものの他に、deoplete などでコード補完もやってくれます。
当初はRubyMineを導入しようかと思ったのですが、Neovimだけで以外にもかなり
生産性の高い開発環境ができてしまいましたので、慣れ親しんだエディタから
から別のツールを使う理由がなくなりました。
他にもRuby 開発を支援してくれるツールはありそうですが、とりあえずここまで。