Vim で Ruby を書くならこれを使え!
私は開発環境を整えるのが大好きなのですが、今まであまり発信をすることがなかったのでこの記事を書きました。
少しでも Vim で Ruby を書くのが快適になれば幸いです。
なお、煽り気味のタイトルですが、それだけ私の独断と偏見で便利だと思っているものです。
私は Ruby では Rails をメインに書いているので、Railsを書いている人には特に便利かも知れません。 mikutter plugin も時々書きます。
この記事では、Ruby に特化したプラグイン/設定の紹介をしたいと思います。
汎用的なものに関しては、簡単な説明とレポジトリへのリンクに留めます。
また、インストール方法は、NeoBundle
を使用する方法を紹介します。
私がNeoBundle
を使用しているので。
neocomplete 用 Ruby 辞書
neocomplete という、Vim の補完プラグインがあります。
neocomplete には、テキストファイルを読み込みそこに書かれた単語を補完候補に出す機能があります。
:help g:neocomplete#sources#dictionary#dictionaries
に詳細が書かれています。
Ruby に標準で定義されているクラス名/メソッド名を列挙した辞書ファイルを作成しました。
これを使用すると、標準で定義されているキーワードを補完してくれるためたいぽが減ります。とてもべんり。
Installation
# 辞書ファイルを clone する $ cd $ git clone https://github.com/pocke/dicts
.vimrc
let g:neocomplete#sources#dictionary#dictionaries = { \ 'ruby': $HOME . '/dicts/ruby.dict', \ }
ruby_hl_lvar.vim
Installation
NeoBundle 'todesking/ruby_hl_lvar.vim'
NeoBundleLazy
したい場合の注意点が下記に書いてあります。
解説
Ruby を編集している時に、ローカル変数をハイライトするプラグインです。
詳しい説明は、プラグイン作者のブログ記事に譲り、ここにはTips的なことを書こうと思います。
高速化
Vim 7.4.330 以降を使っていると、勝手に速くなります。
このプラグインは、ローカル変数のハイライトにmatchadd()
という関数を使っているのですが、この関数でハイライトをしているとカーソル移動が非常に遅くなります。
Vim 7.4.330 で追加されたmatchaddpos()
という関数では、速度が改善されています。
そして、ruby_hl_lvar
ではmatchaddpos()
を使用できる場合はそれを使用するようになっているため、新しい Vim を使っていると勝手に速くなります。
もしこのプラグインを入れて動きが遅くなったと感じたら、Vimのバージョンを確認してみてください。
NeoBundleLazy と共存する
NeoBundle には、NeoBundleLazy
という遅延ロード機能があります。
これを使うとプラグインを遅延ロードすることが出来るため Vim の起動が早くなるのですが、ruby_hl_lvar.vim
で使う際には手動でイベントを叩いてやる必要があります。
具体的には、下記のコードを.vimrc
に書き足してやることで動作します。
let s:bundle = neobundle#get('ruby_hl_lvar.vim') function! s:bundle.hooks.on_post_source(bundle) silent! execute 'doautocmd FileType' &filetype endfunction unlet s:bundle
このスニペットの詳しい説明は、以前ブログに書いたのでそちらを参照してくださると幸いです。
vim-textobj-ruby
Installation
NeoBundle 'kana/vim-textobj-user' " 依存で必要 NeoBundle 'rhysd/vim-textobj-ruby'
解説
テキストオブジェクトのプラグインです。
もしテキストオブジェクトを知らなければ、この記事を読んでみてください。
私はテキストオブジェクト(オペレータ)は、Vim の機能の中で1,2を争う便利機能だと思っています。ほんとに。
このプラグインに関しては、便利だよー!って紹介だけに留め、Qiita記事を紹介したいと思います。 特に自分で変な設定をしていたりしないので…
あっ、 vim-expand-region と組み合わせると便利です。
vim-ruby
Installation
NeoBundle 'vim-ruby/vim-ruby'
解説
Ruby のシンタックスプラグインやその他便利機能が色々入ったプラグインです。
実は、このプラグインはVim本体にバンドルされています(多分)。
それでも私が追加でこのプラグインをインストールしているのは、Vim本体にバンドルされているバージョンが古い可能性があるからです。
詳しくは、以下のIssueを見るとわかると思います。
Vimに新しいバージョンが取り込まれている可能性もありますが、もしRubyを編集中にVimが重くなったらこのプラグインを試してみるといいでしょう。
FileType の設定
ここからはプラグインではなく、細かい設定のことを書こうと思います。
*.rb
なファイル以外にも、Rubyのファイルは多々あります。
ですが、それらは Vim に Ruby だと認識されない場合が多々あります。
下記のコードを.vimrc
に書くとそれらのファイルが Ruby だと認識されるようになります。便利。
autoCmd BufNewFile,BufRead *.jbuilder set filetype=ruby autoCmd BufNewFile,BufRead Guardfile set filetype=ruby autoCmd BufNewFile,BufRead .pryrc set filetype=ruby
もし他にRubyだと認識させたいファイルがあれば、上記のように記述してください。
また、eruby
を書く方は次のように書いておくとより便利かも知れません。
autoCmd FileType eruby exec 'set filetype=' . 'eruby.' . b:eruby_subtype
iskeyword の設定
autoCmd FileType ruby setl iskeyword+=?
Ruby には Boolean を返すメソッドの末尾に?
をつける習慣があります。
しかし、Vimの標準では、?
は単語の区切りとして認識されてしまい、ひと続きの単語として認識されません。
例えば、下記のような設定をしている時に困ります。
" カーソル下の単語でタグジャンプ nnoremap <F3> :<C-u>tab stj <C-R>=expand('<cword>')<CR><CR>zz
このキーマップは、<F3>
キーを押した時にカーソル下のメソッドが定義されているところにジャンプするものです。
しかし、標準では?
をカーソル下の単語に含めないため、そのようなメソッドではうまく動作しません。
それを改善するのがこのiskeyword
の設定です。
この設定をしていれば、?
がカーソル下の単語に含まれるため、うまくジャンプすることが出来ます。
ねむくて大分てきとーな記事になってしまったと思いますが、ご容赦ください。
見返してみるとただのリンク集ですね、ははははは。
ブログ記事を書いてみると、案外Ruby固有のVimプラグイン/設定をしていないことに気が付きました。
気力が湧いたら「ぼくがかんがえるさいきょうのはんようびむぷらぎん」みたいな記事を書きたいです。