pockestrap

Programmer's memo

Vim で Ruby を書くならこれを使え!

私は開発環境を整えるのが大好きなのですが、今まであまり発信をすることがなかったのでこの記事を書きました。
少しでも VimRuby を書くのが快適になれば幸いです。

なお、煽り気味のタイトルですが、それだけ私の独断と偏見で便利だと思っているものです。

私は Ruby では Rails をメインに書いているので、Railsを書いている人には特に便利かも知れません。 mikutter plugin も時々書きます。


この記事では、Ruby に特化したプラグイン/設定の紹介をしたいと思います。
汎用的なものに関しては、簡単な説明とレポジトリへのリンクに留めます。

また、インストール方法は、NeoBundleを使用する方法を紹介します。 私がNeoBundleを使用しているので。

github.com




neocomplete 用 Ruby 辞書

github.com

neocomplete という、Vim の補完プラグインがあります。

github.com

neocomplete には、テキストファイルを読み込みそこに書かれた単語を補完候補に出す機能があります。
:help g:neocomplete#sources#dictionary#dictionariesに詳細が書かれています。

Ruby に標準で定義されているクラス名/メソッド名を列挙した辞書ファイルを作成しました。
これを使用すると、標準で定義されているキーワードを補完してくれるためたいぽが減ります。とてもべんり。

Installation

Vim プラグインではないので少々特殊です。

# 辞書ファイルを 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

github.com

Installation

NeoBundle 'todesking/ruby_hl_lvar.vim'

NeoBundleLazyしたい場合の注意点が下記に書いてあります。

解説

Ruby を編集している時に、ローカル変数をハイライトするプラグインです。
詳しい説明は、プラグイン作者のブログ記事に譲り、ここにはTips的なことを書こうと思います。

www.todesking.com

高速化

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

このスニペットの詳しい説明は、以前ブログに書いたのでそちらを参照してくださると幸いです。

pocke.hatenablog.com




vim-textobj-ruby

github.com

Installation

NeoBundle 'kana/vim-textobj-user' " 依存で必要
NeoBundle 'rhysd/vim-textobj-ruby'

解説

テキストオブジェクトのプラグインです。
もしテキストオブジェクトを知らなければ、この記事を読んでみてください。 私はテキストオブジェクト(オペレータ)は、Vim の機能の中で1,2を争う便利機能だと思っています。ほんとに。

d.hatena.ne.jp

このプラグインに関しては、便利だよー!って紹介だけに留め、Qiita記事を紹介したいと思います。 特に自分で変な設定をしていたりしないので…

qiita.com

あっ、 vim-expand-region と組み合わせると便利です。

github.com




vim-ruby

github.com

Installation

NeoBundle     'vim-ruby/vim-ruby'

解説

Rubyシンタックスプラグインやその他便利機能が色々入ったプラグインです。

実は、このプラグインVim本体にバンドルされています(多分)。
それでも私が追加でこのプラグインをインストールしているのは、Vim本体にバンドルされているバージョンが古い可能性があるからです。 詳しくは、以下のIssueを見るとわかると思います。

github.com

Vimに新しいバージョンが取り込まれている可能性もありますが、もしRubyを編集中にVimが重くなったらこのプラグインを試してみるといいでしょう。




FileType の設定

ここからはプラグインではなく、細かい設定のことを書こうと思います。

*.rbなファイル以外にも、Rubyのファイルは多々あります。 ですが、それらは VimRuby だと認識されない場合が多々あります。

下記のコードを.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プラグイン/設定をしていないことに気が付きました。
気力が湧いたら「ぼくがかんがえるさいきょうのはんようびむぷらぎん」みたいな記事を書きたいです。