僕はRubyで開発をする時は毎回Pryを使うくらいの熱狂的Pryユーザーだったのだが、PryはGemfileに書いてないと binding.pry
できなくて不便。任意のgemをdefault gem化するgem default コマンドも作ったのだが、これをやるのすら面倒だと思っていた。
ある日、nobuさんがRubyに binding.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しないと使えないので僕はVimに inoremap <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さんがIRBをdefault 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のみ色がつく感じになっている。
インクリメンタルハイライト
このバージョンでaycabtaさんがreadline実装を彼が実装したRelineに差し替えたことで、入力行の描画のフックが容易になったため、1文字入力するごとにシンタックスハイライトする機能も実装できた。Pryではこの機能は標準でなく、かつpry-coollineはパフォーマンスに問題があるのかチラチラしてちょっと不快で、その点IRBではチラつきがないのでPryよりとても快適。
Ruby 2.7のIRBの開発が盛り上がりすぎて、ついにREPLの入力のインクリメンタルシンタックスハイライトを実装してしまった pic.twitter.com/TKl3FhJ54Y
— k0kubun (@k0kubun) May 25, 2019
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もこれを使い始めたらしい。
ls コマンド
ここでやっとPry風のIRB使いこなし記事っぽくなるのだが、Pryには ls
というコマンドがあって、短い記述でメソッドや変数の一覧を調べられて便利。あまりにも欲しいのでこれを個人の ~/.irbrc
に実装して過ごしていたのだが、他の人も使いたいという声を見たので、最近IRB本体に実装を移した。とてもよく使う。Pryのcdっぽい機能はIRBに既にあるが、個人的には binding.pry
の貼り直しで済んじゃうことが多いので、Pryでもcdは最近あまり使わない。
なお、IRBではRubyとしてvalidな入力しかできないため、-G
/ --grep
オプションで出力をgrepするためには ~/.irbrc
にちょっと細工をする必要がある。
show_source コマンド
ソースコードリーディングに便利なのがPryの show-source
なんだけど、IRBではRubyとしてvalidな入力しかできないため、まずコマンド名が show_source
になっていて、かつ引数も文字列リテラルで書かないといけないことになっている。それでも便利かなと思っていれたのだが、~/.irbrc
に細工をすると以下の感じで $
という短いエイリアスで使える。
whereami コマンド
細かいが、binding.irb
していろいろやると画面外に元の行が追い出されてわからなくなることがある。そういう時に便利なのが whereami
で、再度 binding.irb
が実行された行を表示することができる。 ~/.irbrc
に細工をすると短い @
というエイリアスで使える。
IRBはRubyとしてvalidでない入力もできるべきか
IRBはコマンドの実装が全てメソッド呼び出しなので、ls -G
、show-source
、@
に関しては上記の通り ~/.irbrc
をいじらないとPryっぽく使えなくなっている。これを受け付けるのは周りの人があんまり乗り気じゃなさそうだったので一旦保留にしたけど、これが欲しいという世論が形成され、誰かがIRBにマージできるような実装を書けば、皆が手元に ~/.irbrc
を持たなくても便利に使える日が来るかもしれない。
pry-byebugは?
僕はpry-byebugを10倍速くしたことがあるので10倍速くしたことがない人よりは多分pry-byebugに思い入れがあるが、個人的には cd の話と同じく binding.irb
の貼り直しで大体の用事が足りてしまうことが多く、いわゆるデバッガっぽい機能は使わなくても済んでしまうことが多い。
しかし、ささださんが標準添付の debug.rb をいい感じにするプロジェクトを最近やっておられ、その過程でIRB連携が導入される可能性があるため、そこでIRBにデバッガ機能が標準でつくこともあるかも。
余談
昔は初心者がPryじゃなくてIRBを使っていると馬鹿にされるということがあったという話を思い出した。今では初心者も安心して使えるREPLになってめでたい。
「昨日text editingに使ってる奴馬鹿にされた」って言われて、エディタのことかなと思って聞いたらirbって返ってきて、irbでコード書いてるのか……と思ったけど単に初心者だからrepl叩いてみていて、pryを使えと馬鹿にされたという話だった
— k0kubun (@k0kubun) October 7, 2014
Special Thanks
僕がIRBにいれた機能は主にaycabtaさんにレビュー、リリースしていただきました。ありがとうございます!