irb の TypeCompletor を Windows でも試してみる

RubyKaigi 2024  の[Writing Weird Code @tompng](https://drive.google.com/file/d/1Dkx15u_5UAGoFqJHCeAuj2FXS-z_U7EE/view) や [Exploring Reline @ima1zumi](https://speakerdeck.com/ima1zumi/exploring-reline-enhancing-command-line-usability) で紹介されている新しい 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 も入れる。

![Image from Gyazo](https://i.gyazo.com/84102b1fd3597e8e0ceeea85c3fff1ea.png)

Which components be shall be installed? If unsure press ENTER [1,3] が出たら `1, 3` を入力してインストール。

![Image from Gyazo](https://i.gyazo.com/84191d1df07352c839ef3534e3c3ad00.png)

まで来たら成功なので 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 のメソッド群がちゃんと出てくる)

![Image from Gyazo](https://i.gyazo.com/00c381ef22a7fa9c42e05fefd99460fb.png)

配列内に数値と文字列を混合すると Integet と String のメソッド群が両方表示される。(つまり `Array<Integer|String>` が解析できている？すごい！)

![Image from Gyazo](https://i.gyazo.com/029f0f16a4f272574ccfd6564934880c.png)


もう一度 TAB を押すとドキュメントも閲覧できる。TAB を押す度に次の候補に移動する。Shift + TAB で前の候補に戻る。

![Image from Gyazo](https://i.gyazo.com/e46d2859894a88bc958c83c80515f4b9.png)


# バグ
Windows の PowerShell やコマンドプロンプト環境だと `Alt+d` でドキュメントを拡大したときに操作ができなくなるバグがあるようなのでそこは押さないように注意。

# 自分が書いたライブラリを読み込む

require のパスも補完される。

![Image from Gyazo](https://i.gyazo.com/5ece9e798d6cb6c0c5d8d0311fc2baa4.png)

ドキュメントや RBS が無くてもメソッド一覧は表示してくれる。

![Image from Gyazo](https://i.gyazo.com/3fe7a4fd6c5bd68629cedcbbaba1aaa5.png)

生成したオブジェクトの型もちゃんと追跡できている。

![Image from Gyazo](https://i.gyazo.com/7d677ccdfa8c8e752d2c215d182b80fd.png)

jc.nodes の戻り値は `Array<JsonCanvas::Node>` なんだけどさすがにここまでは追跡できない模様。(pu を入力したのに push が候補に出ない。) これも RBS 書けば取得できるようになりそう。([rbs-inline](https://zenn.dev/tokium/articles/higashi-rbs-inline-reading))を使って書くのがいいかしら。

![Image from Gyazo](https://i.gyazo.com/aeaeb79166819e6b543d198a02a6e678.png)


# まとめ
ReplTypeCompletor による補完を使うと割といいところまで補完してくれることが分かりました。

TAB 押したときに閲覧できるミニドキュメントは閲覧できるし、他の操作はサクサク動いて快適です。irb 内で require したライブラリのメソッド一覧やドキュメントがさっとみられるのも便利。

![Image from Gyazo](https://i.gyazo.com/0e14a284fa64d7cb1e1bb61f32116b05.png)

自分が書いている gem もちゃんと型を記述すれば irb でサクサク補完できるようになりそうなので RBS を書くメリットが分かりやすくなるのがよかったです。(特に各メソッドの戻り値の型だけでも明示しておくとメソッドチェインが途切れなくなってよさそう)。

次は [rbs-inline](https://zenn.dev/tokium/articles/higashi-rbs-inline-reading) を試してみようと思います。

[ブログのおんがえし](https://ongaeshi.hatenablog.com/entry/2024/05/26/171803) より。