Vim プラグイン ri.vim で Ruby のドキュメントを Vim の中でも見れてしまう
Ruby のクラスやメソッドのドキュメントを見ることができる ri コマンドをベースに, Vim の中でも Ruby のドキュメントを見れるようにしてくれる ri.vim という Vim プラグインがとても便利なので, Vimmer で Rubyist な方は必見です.
この記事のサンプルコードは次の環境での動作を確認しております:
- macOS
10.13.6
- Vim
8.1
- Ruby
2.5.1
- ri.vim
1.2
インストール
ri.vim のインストール方法は, Vundle, NeoBundle, VimPlug, Pathogen などのプラグインマネージャの中から普段使われているものでインストールしていただければと思います.
ちなみに僕は VimPlug を使っています.
それぞれのプラグインマネージャでのインストール方法は次の様になります.
Vundle の場合
.vimrc
に次の行を加え:
Plugin 'danchoi/ri.vim'
次のコマンドを実行します:
:source %
:PluginInstall
NeoBundle の場合
.vimrc
に次の行を加え:
NeoBundle 'danchoi/ri.vim'
次のコマンドを実行します:
:source %
:NeoBundleInstall
VimPlug の場合
.vimrc
に次の行を加え:
Plug 'danchoi/ri.vim'
次のコマンドを実行します:
:source %
:PlugInstall
Pathogen の場合
コマンドラインから次のコマンドを実行します:
cd ~/.vim/bundle
git clone https://github.com/danchoi/ri.vim
使い方
ri.vim の一連の使い方を紹介します.
紹介の過程で <Leader>
という特別な文字列を多用しますが, これはデフォルトで \
になります. ただ, mapleader
変数を ","
や "\<Space>"
などの文字列に設定している場合, その文字列が <Leader>
となります.
例えば, mapleader
変数を ","
と設定してして, ri.vim の <Leader>r
コマンドを入力する時, ,r
というキーシーケンスになります.
<Leader>
のより詳しい説明は Vim のコマンドラインモードから :<Leader>
で見れます.
水平分割のドキュメント
まず Vim を開いて:
<Leader>r
と入力すると, 次のウィンドウが表示されるので:
String
と入力し:
Enter
で String
クラスのドキュメントが水平分割されたウィンドウに表示されます:
このドキュメント内で, <Leader>r
と押すと, String
があらかじめ入力されている検索ウィンドウが表示されます:
::new
と続けて入力して:
<Enter>
で String::new
のドキュメントが表示されます:
String
の new
メソッドはクラスメソッドしかないので String::new
の代わりに String.new
と入力してもいいですね.
そして <Leader>r
を入力すると String::new
があらかじめ入力されている検索ウィンドウが表示されます:
これは String::new
が ::
で区切られているためです.
そのまま ::new
の部分を削除して, 新たな String
クラスのメソッドの検索をしてもいいのですが, その検索ウィンドウを表示する前に -
と入力すると, String::new
から String
のドキュメントに移動することができます:
String
のドキュメントが開いている状態で <Leader>r
と入力すると, 先ほどと同じ様に String
とあらかじめ入力された検索ウィンドウが表示されます:
そして今度は #chomp
と入力して:
<Enter>
で String#chomp
のドキュメントが表示されます:
そして <Leader>r
と入力すると, 今度は String
とだけあらかじめ入力された検索ウィンドウが開きます:
String#chomp
はインスタンスメソッドで, 名前空間にはなり得ないので, 自動的に #chomp
の部分を取り除いてくれるんですね.
そして #chop
と入力して:
Enter
で String#chop
のドキュメントを表示させます:
ドキュメントのキーワードから別のドキュメントへ
ドキュメントを見ると, String#chomp
というテキストがあるので, そのテキストにカーソルを合わせて:
<Enter>
を押すと, String#chomp
のドキュメントに移れます:
Class#method
という形式でなくても, ドキュメントに一致するキーワードであれば, ドキュメント内のどのキーワードからでも <Enter>
で移れます.
String#chomp
のドキュメントの String
にカーソルを合わせて:
<Enter>
を押せば, String
クラスのドキュメントに移れます:
String
クラスのドキュメントの Object
というキーワードにカーソルを合わせて:
<Enter>
を押せば, Object
クラスのドキュメントに移れます:
Object
クラスのドキュメントの BasicObject
にカーソルを合わせて:
<Enter>
を押せば, BasicObject
のドキュメントに移れます:
ドキュメントの戻ると進む
ここまで, String
, String::new
, String
, String#chomp
, String#chop
, String#chomp
, String
, Object
, BasicObject
のドキュメントを表示してきました.
そしてこの状態で, 前のバッファを表示させる Vim の標準的なコマンド <C-o>
を使うと, 同じ様にそれらのドキュメントを遡ることができます.
BasicObject
から Object
, String
, String#chomp
, String#chop
, String#chomp
, String::new
と遡れます.
1 回目と 2 回目の String
は 3 回目の String
に上書きされたのか, 遡ることはできないですけれども.
BasicObject
のドキュメントが開いている状態で, <C-o>
で Object
のドキュメントに戻ります:
もう一回 <C-o>
を入力すると, String
のドキュメントに戻ります:
もう一回 <C-o>
を入力すると, String#chomp
に戻ります:
もう一回 <C-o>
を入力すると, String#chop
に戻ります:
もう一回 <C-o>
を入力すると, String#chomp
に戻ります:
もう一回 <C-o>
を入力すると, String#::new
に戻ります:
<C-o>
の反対のコマンド <C-i>
で戻ってきたドキュメントをまた戻ることもできます.
<C-i>
を入力すると String#chomp
に戻り:
もう一度 <C-i>
を入力すると String#chop
に戻り:
もう一度 <C-i>
を入力すると String#chomp
に戻り:
もう一度 <C-i>
を入力すると String
に戻り:
もう一度 <C-i>
を入力すると Object
に戻り:
もう一度 <C-i>
を入力すると最後尾の BasicObject
に戻ります:
自動補完
<Leader>r
で検索ウィンドウを表示させて, BasicObject
とあらかじめ入力されている状態で:
<C-u>
でその入力を削除して, String.
と入力し直します:
そして <Tab>
を押すとマッチリストが表示されます:
クラスメソッドの場合は String::
, インスタンスメソッドの場合は String#
としてもいいですね.
そのマッチリストが表示されている状態で <C-u>
と入力するとマッチリストのそれぞれのメソッドを選択していけます:
もしくは <C-n>
でも同じことができます:
前の補完に戻る場合 <C-p>
で戻れます:
C-e
でマッチリストを取り消せます:
<Tab>
でまたマッチリストを呼び出せます:
<C-y>
と入力すると, 選択している補完を確定させるにとどまり, ドキュメントを表示させません:
とりあえず補完を確定させたい時に使えます.
<Tab>
を押すと, String#!
から始まるインスタンスメソッドのマッチリストが表示されます:
マッチリスト表示中, <Enter>
で選択しているメソッド (String#!
) のドキュメントを開きます:
メソッド名からクラスメソッド, インスタンスメソッドを検索する
String#!
のドキュメントから <Leader><Leader>r
と入力すると, その String
クラスに定義されているメソッドのマッチリストがあらかじめ表示されている状態で検索できます:
マッチリストの右側に表示されている数字は, それぞれのメソッドの大体のドキュメント量を示しています.
この検索の場合, String
のクラスメソッド, インスタンスメソッドを区別するための記号を指定する必要がなく, ただメソッド名を入力して <Tab>
を押せば, そのメソッド名の String
のクラスメソッド, インスタンスメソッドが自動補完されるか, マッチリストが表示されます.
例えば new
と入力して:
<Tab>
を押すと .new
と自動補完されます:
<Enter>
を押すと String.new
のドキュメントが表示されます:
もう一度 <Leader><Leader>r
と入力して, その検索ウィンドウを表示させて:
例えば each
と入力して:
<Tab>
を押すと, 次の様なマッチリストが表示されます:
そして <Enter>
を押せば, 選択している String#each_byte
のドキュメントが表示されます:
この様にドキュメントから <Leader><Leader>r
で検索ウィンドウを表示させて, メソッド名を入力して <Tab>
を押すと, 同じクラスのそのメソッド名のクラスメソッド, インスタンスメソッドの自動補完が行われたり, マッチリストが表示されます.
先頭に .
や #
を付けて入力する必要がないので, 開いているドキュメントと同じクラスのクラスメソッドやインスタンスメソッドのドキュメントをよりサッと検索できます.
また名前空間下のクラスやモジュールが検索の対象から除かれるので, クラスメソッドやインスタンスメソッドのみ検索することができます.
名前空間の自動補完
<Leader>r
で String
があらかじめ入力された検索ウィンドウを表示させ:
<C-u>
でその入力を削除し, URI:
と入力し, <Tab>
を押すと, URI
モジュールの名前空間下にあるクラスやモジュールのマッチリストが表示されます:
::
ではなく, 一文字のコロン :
がポイントになります.
<C-e>
でそのマッチリストを取り消して, もう一つの :
を付け加えて, URI::
と入力した上で <Tab>
を押すと次の様なマッチリストが表示されます:
この様に URI
モジュールの名前空間下にあるクラスやモジュールに加えて, URI
モジュールのクラスメソッドもマッチリストに表示されます.
なので自動補完する時, :
の場合は名前空間の自動補完, ::
の場合は名前空間に加えて, クラスメソッドも自動補完させるという様に使い分けられます.
垂直分割のドキュメント
何もドキュメントが表示されていない状態で <Leader>R
と入力すると, <Leader>r
の時と同じ様に検索ウィンドウが表示されますが, String
と入力して <Enter>
を押すと, 今度は垂直分割されたウィンドウにドキュメントが表示されます:
表示されているドキュメントから <Leader>r
, -
, <Enter>
, <C-o>
, <C-i>
, <Leader><Leader>r
といったコマンドも同様に使えます.
K
コマンド
現在のバッファが .rb
ファイルで, カーソルをキーワードに合わせて K
を押すと, そのキーワードと一致するドキュメントが水平分割されたウィンドウに表示されます.
例えば example.rb
というファイルを開いて:
String
というキーワードにカーソルを合わせて:
K
と押すと, String
クラスのドキュメントが表示されます:
<C-w>w
でフォーカスを example.rb
のウィンドウに移して, String.new
にカーソルを合わせて:
K
を押すと String.new
のドキュメントが表示されます:
水平分割ではなく垂直分割のウィンドウでドキュメントを見たいという時, <C-w>H
で左側に持ってくることができ:
<C-w>L
で右側に持ってくることができます:
まとめ
Ruby の ri
コマンドをベースに Vim の中でも Ruby のクラスやメソッドのドキュメントを見れるようにしてくれる ri.vim の利便性, Vim を普段使われている方であれば, とても感じられると思います.
Vim で Ruby のコードを書いている時, 例えば, String#slice
って str.slice(index)
の他にどのように使えただろうかという時, すぐさまそのドキュメントを水平分割でも垂直分割でも開けるので, Vim で Ruby のコードを書くのが捗ります.
やっぱり Vim を使っているとどうしてもなるべく Vim から離れたくないという気持ちがあるので, それを可能にしてくれるのはありがたいです.
あと表示されるドキュメントは軽いタッチのカラーハイライティングが施されているので, 可読性も良いです.
Vim を使っている時に Ruby のドキュメントを見る時は ri.vim を使い, Vim を使っていない時は直接 ri
コマンドを使うという感じで使い分けると良いのかもしれません.
デフォルトのマッピングの変更や無効にする方法など, より詳しい内容は公式のレポジトリを参照していただければと思います:
関連記事
Mac で使える Emacs ライクなショートカットが便利2018.02.06
Ruby の正規表現を備忘録としてまとめてみた2018.08.30
Ruby のクラスやメソッドのドキュメントを見れる ri コマンドが便利な件2018.09.08
macOS で Mouse Keys を使ってキーボードでポインタを操作する方法2018.07.11
Bundler をシングルファイル Ruby スクリプトで使う方法2018.04.23