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