vimでrubyプログラミング

仕事でもちょこちょこRubyを使うようになり、だいぶ慣れてきた。ヘタすると長年使ってきたperlよりも書きやすく感じるぐらいである。使う機会も増えてきたことだし、そろそろRubyプログラミング用のエディタが欲しくなってきた。

さて、何がよいか。有名どころではRDTであるが、ちょっとしたスクリプトを書くためにいちいちEclipseのようなクソ重たいIDEを立ち上げるのは億劫だ。Eclipseは「よし!これからプログラム書くぜ!バリバリと打ち込むぜ!!」と気合いを入れて立ち上げるものである。

そこで、シンタックスハイライティングと、あとちょっとしたヘルプ機能があればいいや、という要求で落ち着くわけだが、そうなると、選択肢は広がる。xyzzyにはruby-modeなるものもあるらしいし、秀丸エディタとsakuraエディタにもrubyキーワードを色づけするための設定ファイルがある。そして、UNIX環境生まれのRubyであるから、当然Emacsでのサポートは充実していて、RubyのパッケージにすでにEmacs用の設定ファイルが含まれているという。

しかし、こちとらvi使いだ。できれば、vimを使いたい。と思っていたら、あった。RubyForgeの、Vim/Ruby Configuration Filesプロジェクト。VimRubySupportによると、ハイライティングはもちろん有効で、スマートインデントに対応、コンパイラプラグイン実装・・・じ、自動補完!?Intellisenceみたいな補完ができるらしい。ただし、vim7.0限定。vim7.0から追加されたomnifuncを使っているようだ。

インストール

Windows XPruby 1.8.5とrubygems、そして当然vim7.0をつっこんでいる環境。

Vim/Rubyはgemであっさりインストールできる。


C:\Documents and Settings\idesaku>gem install vim-ruby

まだインストールは完了していない。vim-ruby-install.rbというファイルがRubyのbinディレクトリに現れたはずなので、これを実行する。インストール先は二種類から選択でき、どちらでも良いのだが、別に自分だけの設定に限定することもないので、全体で有効になるよう2を選択した。

C:\Documents and Settings\idesaku>vim-ruby-install.rb

Possible Vim installation directories:
    1) C:/Documents and Settings/idesaku/vimfiles
    2) C:/Program Files/Vim/vimfiles

Please select one (or anything else to specify another directory): 2
autoload/rubycomplete.vim -> C:/Program Files/Vim/vimfiles/autoload/rubycomplete.vim
compiler/eruby.vim        -> C:/Program Files/Vim/vimfiles/compiler/eruby.vim
compiler/ruby.vim         -> C:/Program Files/Vim/vimfiles/compiler/ruby.vim
compiler/rubyunit.vim     -> C:/Program Files/Vim/vimfiles/compiler/rubyunit.vim
ftdetect/ruby.vim         -> C:/Program Files/Vim/vimfiles/ftdetect/ruby.vim
ftplugin/eruby.vim        -> C:/Program Files/Vim/vimfiles/ftplugin/eruby.vim
ftplugin/ruby.vim         -> C:/Program Files/Vim/vimfiles/ftplugin/ruby.vim
indent/eruby.vim          -> C:/Program Files/Vim/vimfiles/indent/eruby.vim
indent/ruby.vim           -> C:/Program Files/Vim/vimfiles/indent/ruby.vim
syntax/eruby.vim          -> C:/Program Files/Vim/vimfiles/syntax/eruby.vim
syntax/ruby.vim           -> C:/Program Files/Vim/vimfiles/syntax/ruby.vim

vimrubyインタフェースを有効にしてビルドしなければならないのだが、One-Click Ruby Installerでインストールできるwin32用バイナリでは有効化してあるので、なんらいじる必要がない。

これで拡張子がrbであるか、先頭行に#!/usr/bin/rubyといった行があるファイルはRubyプログラムと見なされ、これらをvimで編集する際に専用の設定ファイルが読み込まれる。ちなみに、[Rr]akefileもちゃんとrubyプログラムとして認識される。

設定

C:\Documents and Settings\ユーザ名\_vimrcに下記の行を書き加える。

set nocompatible
syntax on
filetype on
filetype indent on
filetype plugin on

使ってみる

では、開いてみる。

キーワードにちゃんと色が付いている。よしよし。画像では示しにくいのだが、スマートインデントも有効だ。3行目の行末で改行してみた結果が次の画像。

余計にインデントが深くなっているが、これは現在のインデント設定が4になっているためである。Rubyでは普通2にするところなのだが、これは後ほど設定することにする。とりあえず、ちゃんとインデントが入ることだけを確認。

さて、お楽しみの自動補完だが、適当なオブジェクト(例えば文字列)の直後にドットを打ったうえで、入力モードのままCtrl-XCtrl-Oと入力すれば良いらしい。

ほんとに出てきたよ・・・。Ctrl-PとCtrl-Nでカーソルを上下移動、Ctrl-Yで決定する。メソッドではなく演算子(のフリをしたメソッド)を選択した場合でもドットが残ってしまうのが玉に瑕だが、テキストエディタで自動補完ができることの感動に比べれば些細なことである。

コンパイラプラグインについては、ドキュメントに使い方が記載されていない(TODO: explain how to use these pluginsというメモ書きが・・・ )ので、まぁそのうち調べようかと。Syntaxチェックして、エラーになったらそのエラー箇所にジャンプする、といったことをやってくれるようだ。これはこれで欲しい機能だな・・・。

設定ファイルを見た限りでは、 :make とすると :!ruby -w % 相当のコマンドを走らせるようなのだが、設定ファイルがうまく読み込まれていないようで普通にmakeを実行しようとする。検証が必要だ・・・。

使い方がわかった。これが正しいのかはわからんが。

C:\Documents and Settings\ユーザ名\vimfiles\after\ftplugin\ruby.vimに、次の一行を追加すれば機能が有効になる。

compiler ruby

これにより、QuickFixを使用できるようになる。大雑把に説明すると、rubyスクリプトの編集中に:make -c %とすると、シンタックスチェックが走る。で、もしエラーがでていれば、:cwするとQuickFixリストが表示される。ここで、

  • :cc [n]でn番目のエラー行にジャンプ
  • :cnで次のエラー行にジャンプ
  • :cNで前のエラー行にジャンプ

する。

詳しくは、:help quickfixするか、その日本語訳を読むか、こちらのサイトを参照のこと。

ついでにmatchit

vim/Rubyにはmatchitの設定が含まれる。viでは、%を使って対応する括弧またはブレス間でカーソルを往復させることができる。matchitは、これを拡張してHTMLやLaTeXでも%が働くようにしたもの。Rubyでは、例えばif〜endやwhile〜end間のジャンプが可能になる。

決まった場所に、決まったファイルを置くだけなのでインストールも簡単だし、入れておいたほうが良い。

ここから最新のmatchit.zipを落としてくる。これを解凍してできたplugin\matchit.vimを、C:\Documents and Settings\ユーザ名\vimfiles\plugin\に置く。これだけ。

いちおう、ヘルプドキュメントも読めるようにしておくか。matchit.zipを解凍したときに出来ているはずのdoc\matchit.txtを、C:\Documents and Settings\ユーザ名\vimfiles\doc\に置いた後、おもむろにvimを立ち上げて、:helptags ~\vimfiles\docと打てば完了。:h g%などと打ってみると、matchitのヘルプが読めるはず。

ちなみに、両方ともファイルの置き場所はC:\Documents and Settings\ユーザ名\...ではなくc:\Program Files\vim\vimfiles\...であっても良い。設定が有効になるのが単一ユーザか全ユーザかという違いがある。

カスタマイズ

さて、先ほど触れたが、Rubyではインデントの深さを通常2文字分にする。しかし、CやJavaでは4文字や8文字幅が一般的なので、Rubyプログラムをいじるときのみ2文字幅にしたい。

この場合、C:\Program Files\Vim\vimfiles\と同じディレクトリ構造をC:\Documents and Settings\ユーザ名\vimfiles\afterとして作成し、vimfiles\after\ftplugin\ruby.vimを作成、その中に追加設定を書き込めばよい。VimRubySupportでは下記の設定を推奨している。

set expandtab "ソフトtabを有効に
set tabstop=2 shiftwidth=2 softtabstop=2 "インデント幅を2文字に
set autoindent "オートインデントを有効に

これにより、Rubyプログラムを編集するときのみ、設定が上記のもので上書きされる。ただし、上書きしてしまうので、Rubyプログラムを編集したエディタで続けて別のファイルを編集した場合、この設定は元に戻らず残り続ける。

ほかにも細々とした設定が可能だが、突き詰めるとvimスクリプトを書いたりしなければならないので、面倒くさい。本当に高度な機能が欲しければ素直にRDTを使うのが良いと思う。テキストエディタとしてはここまでで十分な機能だ。

トラブルシュート

One-Click Ruby Installerは、rubyへのPATHをよくわからんやり方で通している。何が言いたいかというと、コマンドプロンプトrubyを実行できたからといって、ちゃんとPATHに設定されているとは限らない。自動補完を使うためにはvimRubyインタフェースが有効でなければならず、これを有効にするには、RubyのbinディレクトリにPATHが通っていなければならない。PATH設定を忘れないこと。

自動補完はgVimでは有効になったが、コマンドプロンプトvimを使用した場合は無効化される。単にrubyインタープリタを呼んだだけでも「E319: このバージョンではこのコマンドは実行できません, ごめんなさい」と出てくるので、そもそも対応していないのかもしれない。シンタックスハイライティングとスマートインデントは問題なく機能する。