vim-users.jp

Hack #231: Rubyで入力と出力からメソッド名を自動補完する

Posted at 2011/09/20
このエントリーをはてなブックマークに追加

こんにちは、ujihisaです。社内Hackathonがあるということで土日に出社したものの、どちらも僕以外全員不参加で涙目でした。

問題

Rubyでメソッド名を補完する方法をHack #229: 動的型付け言語Rubyでメソッド名などを自動補完するで紹介しました。これは、オブジェクトからそのメソッドをすべて網羅することで補完を行うというアプローチでした。

では、オブジェクトと、メソッドを呼び出すことで得られる返り値の両方から補完を行うことはできないのでしょうか。

例示します。Rubyでは、1というオブジェクトから2というオブジェクトを得るには、1に対してsuccまたはnextというメソッドを呼び出すことで実現できます。

1.succ #=> 2

また、[:a, :b, :c]というオブジェクトから:aというオブジェクトを得るには、[:a, :b, :c]というオブジェクトにfirstなどのメソッドを呼び出すことで実現できます。

[:a, :b, :c].first #=> :a

カーソル位置がオブジェクトの直後のメソッド呼び出しの.にあるとき、メソッド名が自動補完されるのを期待するのはごく自然なことと思います。

解決

つい先日リリースされたばかりの、neco-rubymfというneocomplcacheプラギンを用います。

インストール:

  • Rubygemsパッケージmethodfinderをインストールします。

      $ gem install methodfinder
    
  • neocomplcacheプラギンneco-rubymfをインストールします。もしも未だにneocomplcacheをインストールしていなければ、そちらもインストールして下さい。

続いて、'filetype'rubyであるバッファで、以下のように入力します(ただしはカーソルのつもりです。)

1.¶ #=> 2

すると、1というオブジェクトが持つメソッドでかつ返り値が2であるメソッド nextsuccが補完候補にあらわれます。

neco-rubymf

同様に、

[:a, :b, :c].¶ #=> :a

に対して

array

が得られます。

以下に他の例を画像で示します。

1

2

3

※最後の例は確率的に発生します。

ujihisa

もどる
blog comments powered by Disqus