Pryはもう古い、時代はIRB

僕はRubyで開発をする時は毎回Pryを使うくらいの熱狂的Pryユーザーだったのだが、PryはGemfileに書いてないと binding.pry できなくて不便。任意のgemをdefault gem化するgem default コマンドも作ったのだが、これをやるのすら面倒だと思っていた。

ある日、nobuさんがRubybinding.irb という機能をいれた。Pryがdefault gemになるのを待つよりPryで僕が使う機能をIRBに全部移植してしまった方が早いのではないかと思い、4年前からPryの機能の移植活動を始め、今日僕がよく使う機能を全て移植し終えた。

その記念に、この記事ではIRBのPry互換の機能を紹介する。昔 今更聞けないpryの使い方と便利プラグイン集 という記事を書いたんだけど、この中で僕が毎日のように使うコマンドは全てIRBに移植したので、それを紹介する本稿を読むだけで今日からあなたもIRBが便利に使えるようになる。

IRBのPry互換機能の変遷

新しめの機能が多いので、使えるようになったバージョンごとに機能を紹介する。

Ruby 2.4

binding.irb

nobuさんが binding.irb入れた歴史的バージョン。この時点ではどこで起動されたかが表示されず、binding.pry の代わりとしては正直ちょっと不便かなという状態だった。ただ、標準ライブラリなのでGemfileに書いてなくても使えるのが強み。

$ cat a.rb
foo = "hello world"
binding.irb

$ ruby -rirb a.rb
irb(main):001:0> foo
=> "hello world"

Ruby 2.5

irbの自動require

nobuさんが次に、binding.irb をするとirbが自動でrequireされるという機能を入れた。pryはrequireしないと使えないので僕はViminoremap <C-v> require "pry";binding.pry という設定があるのだが、binding.irb はこんな面倒なことをしなくても使えるので、また一つPryにない強みができた。

binding.irb の周辺行表示

ここから僕が参戦。Ruby 2.5から、binding.irb の周辺行が表示されるようにした。やっぱりこれがないと使いにくい。この時点ではまだ白黒。

$ ruby a.rb

From: a.rb @ line 2 :

    1: foo = "hello world"
 => 2: binding.irb

irb(main):001:0> foo
=> "hello world"

Ruby 2.6

default gem化

hsbtさんがIRBdefault gem化Ruby 2.6になるまではIRBはgem化されてない標準ライブラリだった。gem化によって、Pryと同じように gem install irb でインストールやアップデートが可能になった。gem install irb さえしてしまえば、例えばRuby 2.5でも最新のIRBの機能が大体使える。Gemfileに書いてない限りは bundle exec してしまうとそれは使われないので、新しいRubyを使うことはgem化された今でも重要である。

Ruby 2.7

シンタックスハイライト

僕の好きな標準ライブラリはRipperなんだけど、その趣味を炸裂させて実装したのがシンタックスハイライト。binding.pry での周辺行に色がつくようになり、本格的にPryっぽくなってきた。IRB::Color が標準添付のRubyシンタックスハイライトライブラリとなり、個人gemで使ったりしている。なお、inspectの結果はシンタックスハイライトとは少し勝手が違うため、このバージョンではRubyリテラルとしてvalidになるようなinspectのみ色がつく感じになっている。

f:id:k0kubun:20210402210027p:plain

インクリメンタルハイライト

このバージョンでaycabtaさんがreadline実装を彼が実装したRelineに差し替えたことで、入力行の描画のフックが容易になったため、1文字入力するごとにシンタックスハイライトする機能も実装できた。Pryではこの機能は標準でなく、かつpry-coollineはパフォーマンスに問題があるのかチラチラしてちょっと不快で、その点IRBではチラつきがないのでPryよりとても快適。

Ruby 3.1

これ以降の機能はRuby 3.0がリリースされてから開発したため、リリース済みのRubyには標準では入っていない。aycabtaさんがそろそろIRBのリリースをするらしいので、そのうち gem install irb では使えるようになる予定 (追記: 1.3.5でリリースされた)。バージョンが古くても以下のコマンドは使いたいなと思ったので、僕はirbrcに当面の間ベタ書きすることにした。

複雑なオブジェクトのinspect色付け

inspect結果はRubyとしてvalidではないことがあるためシンタックスハイライトのコードが流用できないのだが、Pryの真似をしてmasterではこれを実装してあるActiveRecord::Baseインスタンスも綺麗に色がつくようになったので rails c で便利。IRB::ColorPrinter が標準添付のinspect色付けライブラリとして使えるようになったので、power_assertもこれを使い始めたらしい。

f:id:k0kubun:20210402210201p:plain

ls コマンド

ここでやっとPry風のIRB使いこなし記事っぽくなるのだが、Pryには ls というコマンドがあって、短い記述でメソッドや変数の一覧を調べられて便利。あまりにも欲しいのでこれを個人の ~/.irbrc に実装して過ごしていたのだが、他の人も使いたいという声を見たので、最近IRB本体に実装を移した。とてもよく使う。Pryのcdっぽい機能はIRBに既にあるが、個人的には binding.pry の貼り直しで済んじゃうことが多いので、Pryでもcdは最近あまり使わない。

f:id:k0kubun:20210402210407p:plain

なお、IRBではRubyとしてvalidな入力しかできないため、-G / --grep オプションで出力をgrepするためには ~/.irbrcちょっと細工をする必要がある。

show_source コマンド

ソースコードリーディングに便利なのがPryの show-source なんだけど、IRBではRubyとしてvalidな入力しかできないため、まずコマンド名が show_source になっていて、かつ引数も文字列リテラルで書かないといけないことになっている。それでも便利かなと思っていれたのだが、~/.irbrc細工をすると以下の感じで $ という短いエイリアスで使える。

f:id:k0kubun:20210402210556p:plain

whereami コマンド

細かいが、binding.irb していろいろやると画面外に元の行が追い出されてわからなくなることがある。そういう時に便利なのが whereami で、再度 binding.irb が実行された行を表示することができる。 ~/.irbrc細工をすると短い @ というエイリアスで使える。

f:id:k0kubun:20210402210739p:plain

IRBRubyとしてvalidでない入力もできるべきか

IRBはコマンドの実装が全てメソッド呼び出しなので、ls -Gshow-source@ に関しては上記の通り ~/.irbrc をいじらないとPryっぽく使えなくなっている。これを受け付けるのは周りの人があんまり乗り気じゃなさそうだったので一旦保留にしたけど、これが欲しいという世論が形成され、誰かがIRBにマージできるような実装を書けば、皆が手元に ~/.irbrc を持たなくても便利に使える日が来るかもしれない。

pry-byebugは?

僕はpry-byebugを10倍速くしたことがあるので10倍速くしたことがない人よりは多分pry-byebugに思い入れがあるが、個人的には cd の話と同じく binding.irb の貼り直しで大体の用事が足りてしまうことが多く、いわゆるデバッガっぽい機能は使わなくても済んでしまうことが多い。

しかし、ささださんが標準添付の debug.rb をいい感じにするプロジェクトを最近やっておられ、その過程でIRB連携が導入される可能性があるため、そこでIRBにデバッガ機能が標準でつくこともあるかも。

余談

昔は初心者がPryじゃなくてIRBを使っていると馬鹿にされるということがあったという話を思い出した。今では初心者も安心して使えるREPLになってめでたい。

Special Thanks

僕がIRBにいれた機能は主にaycabtaさんにレビュー、リリースしていただきました。ありがとうございます!