今更聞けないpryの使い方と便利プラグイン集

Rubyのソースコードを読むとき、grepやctagsだけで読んでるとどこにどういう値が入るのか頭で考える必要があり大変。
そういう時、実際に動かしながらpryを使って中身を確認すると、どういう動きをしているのか楽に把握できる。
普通のエディタを使ってRubyを書いている人にとって、IDE的な機能を提供してくれるのがpryといえる。

本稿では、この記事を書く前の私のように、この次の「最低限の使い方」くらいしかpryを使いこなせていない人向けに、便利な機能をひと通り説明する。

# 最低限の使い方
まだpryを使ったことがない人はこれだけ知ってれば十分な気がする。

## binding.pryで任意の場所からREPLを立ち上げる
![](http://i.gyazo.com/a88f3e92d10b69eb60cafa9c771c8d66.png)

ソースの任意の箇所に`binding.pry`を書いてRubyのプログラムを走らせると、実行中にその行でストップしてpryのREPLが立ち上がり、その環境での変数がどうなっているかなどが参照できる。
アプリが原因不明のエラーを出している時、落ちている直前に`binding.pry`を挟んで原因を調査したり、テストが落ちている原因の特定などに便利。

# pry標準の機能
irbとは違った使い方ができるよう、pryの便利な機能をよく使いそうな順に紹介する。

## `?`, show-doc, ri, `$`, show-method
![](http://i.gyazo.com/eb06b33ad66af35c70fcd792c705a40d.gif)

`?`やshow-docを使うとドキュメントを見ることができる。riはriコマンドを実行する。
`$`やshow-methodを使うとメソッドの定義を見ることができるが、CRubyのソースを見たいときはpry-doc gemをインストールする必要がある。

ドキュメントもソースコードもpry内で見れてしまうので、ブラウザを開く必要がなくなる。

## edit
![](http://i.gyazo.com/7ee90d49e4c3dabbc0ace688e2d35fc9.gif)

今はまだどこにソースがあるかがわからないところにbinding.pryを貼りたいことがある。
editを使うとpryで定義場所を調べたあとエディタでそれを開くみたいなコストが減らせる。
あとは周辺をそのまま読みたいときにも便利。

エディタは$EDITORをいじるか.pryrcに`Pry.editor = 'vim'`とか書けば変えられる。

## cd, ls, Tab補完
![](http://i.gyazo.com/bb2f76bc423d7f4aaf61b590da4e20ed.gif)

pryも普通のシェルと同じようにcd, lsやタブキーによる補完がある。
cdを使うとコンテキストを移動できる。上の画像ではmainからAcitveRecord::RelationやArelの内側に入っている。

lsは現在のコンテキストにおけるメソッドや変数の一覧が見れる。
メソッドの一覧だけ見たいときは`ls -m`。`ls --grep`で絞込ができる。

## exit!, !!!, exit-program, disable-pry, edit -m

何度も呼ばれるメソッドやループの内側にbinding.pryを書いて何度もブレークして困った事がある人は多いと思う。
一番楽で乱暴な方法はexit!, !!!, exit-programでプロセスを終了してしまうことである。でもこれだと例えばrails s上でやるとrails sが落ちる。
disable-pryは以降pryが完全に無効になるのでプロセスは死なないけど、以降binding.pryが使えなくなる。

多分一番健全な方法は、ちょっと面倒だけどedit -mで現在のメソッドからbinding.pryを取り除くことだと思う。

## `.`とshell-mode
![](http://i.gyazo.com/f14d07121f0875159ee633e06a7a4e3e.png)

「.」で始めると以降をシェルのコマンド入力として受け付ける。画像のように`#{}`の式展開が使える。
`shell-mode`を使うとカレントディレクトリを表示してくれるのと、ファイル名補完が有効になる。

## help
![](http://i.gyazo.com/680ea47434d0f7542ee34ccbfd1edaf1.png)

単にRubyの式を評価するだけでなく、pryには独自のコマンドが存在する。その全リストを`help`コマンドで確認することができる。
セクションごとに分けて表示してくれるので、例えばpry-railsプラグイン特有の機能のリストを見たいときなどに役に立つ。

各コマンドは`-h`(`--help`)をつけると使い方を見ることができる。
余力がある人は`hist`, `find-method`, `whereami`(`@`), `nesting` あたりは見ておくと良いと思う。

# 便利なプラグイン
pryにはプラグインがたくさんある。 [★](http://rubygems.org/search?utf8=%E2%9C%93&query=pry-)
個人的には以下の3つだけ知ってれば十分だと思うので、これらを紹介したい。

## pry-byebug
![](http://i.gyazo.com/835f0eb624520884115acd9b0603f50c.gif)

古代のRuby向けに作られた[pry-nav](https://github.com/nixme/pry-nav)と[pry-debugger](https://github.com/nixme/pry-debugger)の後継が[pry-byebug](https://github.com/deivid-rodriguez/pry-byebug)。
ステップ実行など、デバッガとしてちゃんとpryを使いたい場合はこれが必要になる。

以下のコマンドだけ覚えておけば良い。

|コマンド|操作|
|:-------|:---|
|step    |メソッドの内部に入る|
|next    |現在のメソッド内で1行進める|
|finish  |現在のメソッドを抜ける|
|continue|デバッグを抜ける|

下記を書いておくとエンターを押すだけで前のコマンドを繰り返せるようになる。

```rb:~/.pryrc
# Hit Enter to repeat last command
Pry::Commands.command /^$/, "repeat last command" do
  _pry_.run_command Pry.history.to_a.last
end
```

`~/.pryrc`でコマンドのエイリアスを定義しておくと使いやすくなる。

```rb:~/.pryrc
if defined?(PryByebug)
  Pry.commands.alias_command 's', 'step'
  Pry.commands.alias_command 'n', 'next'
  Pry.commands.alias_command 'f', 'finish'
  Pry.commands.alias_command 'c', 'continue'
end
```

## pry-stack\_explorer
![](http://i.gyazo.com/43a2d95de36c6c3f3c08b91f6dc476cc.gif)

`show-stack`してスタックのリストを出し`frame [数字]`とやると任意のスタックにコンテキストを移動できる。`up`, `down`でスタックフレームを上下に移動できる。

これも`~/.pryrc`でエイリアスすると使いやすくなる。

```rb:~/.pryrc
if defined?(PryStackExplorer)
  Pry.commands.alias_command 'bt', 'show-stack'
end
```
## pry-rails
rails cを置き換えるのがメインで、いくつかは機能がrake taskとかぶっている。
それでも一応使いそうなのを紹介しておく。

### show-routes
![](http://i.gyazo.com/887e1beab506a6ac853ae1f415c2b997.png)

とにかく実行がめちゃくちゃ速い。`spring rake routes`より速いので良い。`-G`(`--grep`)で絞り込む。
単にパスがどう引っかかるか調べたいときは`recognize-path`を使う。

### show-model, show-models
![](http://i.gyazo.com/c65a5df26514e91f77fdcbb6a1759ed6.png)

schema.rbとかを開かなくてもスキーマが確認できるので便利。
show-modelsを使うと全部表示される。

### reload!
rails cを再起動しなくて済む。