RubyKaigi 2024 のWriting Weird Code @tompng や Exploring Reline @ima1zumi で紹介されている新しい irb の補完機能がよさそうなので手元でもインストールしてみた。
Ruby 3.3 のインストール
3.2 でも gem update irb とかすれば動くらしいけどせっかくなので Ruby 3.3 を入れる。
https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.3.1-1/rubyinstaller-devkit-3.3.1-1-x64.exe をダウンロード&インストール。
Ruby 本体は普通のインストーラが起動するので普通に C:\Ruby33-x64
に入れる。
次に MSYS2 と DevKit も入れる。
Which components be shall be installed? If unsure press ENTER [1,3] が出たら 1, 3
を入力してインストール。
まで来たら成功なので ENTER を押して終了。
ReplTypeCompletor gem のインストール
Windows版だと? Ruby 3.3 でも ReplTypeCompletor は標準でインストールされていないようなので事前にインストールしておく。
PS> gem install repl_type_completor
.irbrc の設定
.irbrc
に以下の設定を追加。(設定しない場合は irb --type-completor
で起動すれば OK)
IRB.conf[:COMPLETOR] = :type
irb を起動&設定の確認
irb を起動する。
PS> irb
irb_info
を入力して設定が Completion が ReplTypeCompletor になっていることを確認する。
irb(main):025> irb_info Ruby version: 3.3.1 IRB version: irb 1.11.0 (2023-12-19) InputMethod: RelineInputMethod with Reline 0.4.1 Completion: Autocomplete, ReplTypeCompletor: 0.1.6, Prism: 0.19.0, RBS: 3.4.0 .irbrc path: C:/Users/ongaeshi/.irbrc RUBY_PLATFORM: x64-mingw-ucrt East Asian Ambiguous Width: 1 Code page: 932 => nil
ReplTypeCompletor による補完を試す
配列の中身が String であることを認識して、ブロック引数の型も理解してくれるのが便利。(l を入力すると Sting のメソッド群がちゃんと出てくる)
配列内に数値と文字列を混合すると Integet と String のメソッド群が両方表示される。(つまり Array<Integer|String>
が解析できている?すごい!)
もう一度 TAB を押すとドキュメントも閲覧できる。TAB を押す度に次の候補に移動する。Shift + TAB で前の候補に戻る。
バグ
Windows の PowerShell やコマンドプロンプト環境だと Alt+d
でドキュメントを拡大したときに操作ができなくなるバグがあるようなのでそこは押さないように注意。
自分が書いたライブラリを読み込む
require のパスも補完される。
ドキュメントや RBS が無くてもメソッド一覧は表示してくれる。
生成したオブジェクトの型もちゃんと追跡できている。
jc.nodes の戻り値は Array<JsonCanvas::Node>
なんだけどさすがにここまでは追跡できない模様。(pu を入力したのに push が候補に出ない。) これも RBS 書けば取得できるようになりそう。(rbs-inline)を使って書くのがいいかしら。
まとめ
ReplTypeCompletor による補完を使うと割といいところまで補完してくれることが分かりました。
TAB 押したときに閲覧できるミニドキュメントは閲覧できるし、他の操作はサクサク動いて快適です。irb 内で require したライブラリのメソッド一覧やドキュメントがさっとみられるのも便利。
自分が書いている gem もちゃんと型を記述すれば irb でサクサク補完できるようになりそうなので RBS を書くメリットが分かりやすくなるのがよかったです。(特に各メソッドの戻り値の型だけでも明示しておくとメソッドチェインが途切れなくなってよさそう)。
次は rbs-inline を試してみようと思います。