2024-02-29

wrapped_lines から読んだ。 wrapped_lines では最終的に折り返し込の行(色あり)を返しているが、高速化のために色々とキャッシュを入れている。まず modified_lines で折り返しを含まない行データに対してキャッシュし、キャッシュがないか状態が異なる場合に、modify procを呼び出す。IRBから呼んだ場合はこれが色付けProcになり、入力をruby-lexでパースしてANSI Escape Codeで色をつける。その結果が modified_lines に入ってくる。wrapped_lines はまず前回 wrapped_lines を実行したときの情報を取ってきてそれがあるならキャッシュとして cached_wrapspromptline の情報を詰め込む。そして次に @buffer_of_lines.size 回lineを取り出す。promptとlineをキーにしたcached_wrapsがあればそれを使い、ない場合はsplit_widthに渡してEscape Code考慮かつ端末幅を考慮して入力を切った配列を受け取る。配列で使うのは firstnil でない行だけなので、 .first.compact しておく。

split_by_width の返し方が謎い。 [0] には幅でばつっと切った文字列が詰め込まれた配列が入ってくるんだけど、区切りに nil が使われている?よくわからない。 wrapped_lines の呼び出しでは nil はいらないので compact しているみたいだ。

split_by_width("#{prompt}#{line}", 10)
[["irb(main):", nil, "001> \e[34m\e[1m\e[4mS\e[0m"], 2]

update も終わって line_editor.rerender まで到達した。update では計算するだけでレンダリングはせず、レンダリングは後の line_editor.rerender に任せることになったんだとおもう。次はついに render_differential だ。

render_differential は resize, SIGINT, rerender からしか呼ばれない。スッキリ!