Ruby
Rails
pry

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

More than 1 year has passed since last update.

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

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

最低限の使い方

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

binding.pryで任意の場所からREPLを立ち上げる

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

pry標準の機能

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

?, show-doc, ri, $, show-method

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

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

edit

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

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

cd, ls, Tab補完

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

lsは現在のコンテキストにおけるメソッドや変数の一覧が見れる。
メソッドの一覧だけ見たいときはls -mls --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

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

help

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

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

便利なプラグイン

pryにはプラグインがたくさんある。
個人的には以下の3つだけ知ってれば十分だと思うので、これらを紹介したい。

pry-byebug

古代のRuby向けに作られたpry-navpry-debuggerの後継がpry-byebug
ステップ実行など、デバッガとしてちゃんとpryを使いたい場合はこれが必要になる。

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

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

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

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

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

~/.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

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

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

~/.pryrc
if defined?(PryStackExplorer)
  Pry.commands.alias_command 'bt', 'show-stack'
end

pry-rails

rails cを置き換えるのがメインで、いくつかは機能がrake taskとかぶっている。
それでも一応使いそうなのを紹介しておく。

show-routes

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

show-model, show-models

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

reload!

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