Skip to content

Instantly share code, notes, and snippets.

@tompng
Last active April 29, 2024 15:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tompng/7791c11d10c914c2f7c1a7cb0341df9e to your computer and use it in GitHub Desktop.
Save tompng/7791c11d10c914c2f7c1a7cb0341df9e to your computer and use it in GitHub Desktop.
  • 極端に長い行の貼り付け・編集などのパフォーマンスが悪い

    • 長い行数を貼り付けるよりも利用頻度高そう。jsonを貼り付けるとか。どこがボトルネックか測る
  • Unicode

    • split_by_widthはheightを返す必要もないし配列の偶数番めにnilを含める必要もない
    • get_prev_mbchar とか、unicode.rbでやるべきことか怪しいような
    • get_nth_prev_mbchar とかにしないとvi_argが大きい場合のパフォーマンスが悪い
    • get_mbchar_widthの高速化をどこまでやるか(あと2段階くらい変身を残してる)効果がどれくらいあるか測る
  • GeneralIO

    • 存在意義が謎 歴史的にはテスト専用(2019/5/21:test_modeでのみ使用 2021/5/14:TTYではない時にも使うよう変更)
    • テスト専用ならTERM=dumbの時以外には使ってはいけないし名前が良くない
  • Reline::Key

    • symbolとintを混ぜない
    • key_stroke.rbで必要ないのに乱用されてるのをやめる
  • ANSI

    • TTYではない時の分岐があるが不十分
    • cursor_posのtimeoutとwarnがあっても良い
    • バッファリングしてるのにcursor_posで直接stdinに戻してるのは不自然
    • バッファリングしてるのに1byteずつ読み込むのは不自然
    • 謎の0x16の処理がretrieve_keybufferでの一括読み込みで抜け落ちてる
  • additional_key_bindings oneshot_key_bindings

    • Keyを1つ処理するごとに毎回全部mergeするのは無駄
  • KeyStroke#expand

    • そもそも引数と返り値の設計にバグがある(修正案:keysではなくmatched_keys,restを返す)
    • うまくやらないとbracketed_pasteが動かない(修正案:expandせずmatchしたkeyを1つずつ取り出す)
  • KeyStroke#start_with?

    • 線形探索なので遅そう matchedだけでなくmatchingになるバイト列も登録すると楽になる
    • compress_meta_key済みのバイト列も事前登録すると良い
    • expandとstart_with?で処理が重複している
    • IOGateとバッファリングが二重になってしまう(別にいいけど)
  • LineEditor

    • vi専用・emacs専用のstateはそれぞれvi emacs用の何かの中でまとめて管理した方が見通し立ちやすい
    • 一見使われていなさそうなalias、消していいのかreadline互換のkeybinding設定のためなのか区別つかない
    • ファイルもでかいので、描画・バッファの編集とで役割をいい感じに分割してもいいかもしれない
    • viのためだけにwaiting_operatorの仕組みを入れず、viで閉じたところで頑張ってほしい
    • multibyte_buffer はLineEditorがやるべきではない。validなstringのみ渡ってくるべき
    • retrieve_completion_block は副作用(insert_text)がある
    • Reline.core.instance_variable_set が怪しい
    • complete_internal_proc filtered_listとcommon_partを返すだけにすると良い。menu作成までやるのはやりすぎ
    • completion list に対するunicode_normalizeするタイミングが怪しい。ちゃんとやるか、やらなくていいなら消したい。listをfilterするタイミングも同様かも
    • completion関連のkeyのハードコードをやめる。(ハードコードが常に悪いわけじゃないけど、これは無理した結果っぽい)
    • unless completion_occurs でやらず、明示的にautocompleteを発動させた方がシンプル(key入力とdeleteだけで良さそう)
    • completionのvi分岐は、keybinding設定できるようにすれば消せる
    • normal_charでprocess_key呼ばなくて良いようにできそう
    • vi-modeのcombined_char ESCキー分解はline_editorじゃないところでやりたい
    • recursive(key, arg: arg) if arg > 0 をやめる。再帰もしない、繰り返しにする必要もない。arg回の操作をした結果を1回で計算できる
    • retrieve_completion_block が効率悪い(1行が非常に長い時にボトルネック)
  • Dialog

    • dialog_proc_scope がcompletion関連の内部情報を公開する必要は(completionのリファクタ以降は)なさそう
  • KillRing

    • 特に問題はないけど双方向リストの代わりにArrayで十分
  • test_rendering

    • yamatanoorotiが遅すぎる
    • 一部テストはLineEditorが描画したつもりになっているscreenで代替可能
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment