僕の考えた最強のTUI grepツールを作った

大きなコードベースを持ったプロジェクトでコードを書くとなった時に、書くのと同じくらい(またはそれ以上に)コードを読むことになると思います。

なので、コードの検索ツールの良し悪しは生産性に直接的に影響してくると言えるでしょう。

VSCode へのお気持ち

僕は普段はIntelliJを使っていて、その検索ツールの出来(もちろんそれ以外も)に非常に満足していますが、諸々の事情からVSCodeを使いたいという気持ちになることが多々あります。

しかし、どうしてもVSCodeの検索ツールが好きになれず移行する気持ちになれないでいました。

具体的に何が好きになれないかと言うと、Open in Editorを使用しない場合は、検索結果の周辺コードのプレビューを見るためにファイルをポコポコ開いていく必要がありツライです。Open in Editorを使用する場合は、周辺コードの情報量の調整が面倒でツライです。

<2/16 追記>

"workbench.editor.enablePreview": true にすることでポコポコ開かずに済むことを教えてもらいました。ありがとうございます🙇

僕の考える最強

僕がほしかった grep ツールは次の特徴を満たしたものです。

MUST

  • 先頭一致・単語・正規表現での検索ができる
  • インクリメンタルサーチができる
  • 周辺コードのプレビューが出来る
  • ハイライトされたプレビュー
  • ファイルをポコポコ開かずにプレビューできる
  • 自動でリサイズされる
  • エディタでヒットしたところを直接開ける

SHOULD

  • 高速
  • あいまい検索ができる
  • 検索ディレクトリを指定できる
  • 検索対象外のディレクトリを指定できる
  • 履歴機能

作った

そんなこんなで IntelliJ ライクな TUI grep ツール ilse を作りました!

github.com

こういったツールは世の中にありふれていると思っていたのですが、調べた限り自分好みのものはほとんど存在していませんでした。

f:id:tjmtmmnk:20210215035829g:plain
動作イメージ

f:id:tjmtmmnk:20210215035700p:plain
VSCodeでの使用イメージ

状況

僕の考える最強で掲げたうちMUSTは達成済みです。SHOULDは、あいまい検索と検索ディレクトリを指定するのは達成済みです。

あいまい検索は、ちょっと大きめのコードベースになると使い物にならない状態になってしまうので改善していく予定です。

製作後記

tview というTUIライブラリのおかげで、UI面を高速に実装することができました。

github.com

tviewを使う上で、躓いたのがプレビューでのANSIコードの扱いでした。 ユーザーのターミナルの背景が何であれ表示が乱れないように背景を黒にしようとした時に、何故か文字があるところだけが背景がユーザーのデフォルトになってしまっていました(このissueと同じ状態)。

原因としては、batコマンドによるリセットフラグ\x1b[0mが入ってくることで背景の設定がなくなってしまうことでした。

そこで、リセットフラグを全て\x1b[39;40mという文字はデフォルトで背景が黒色になるようなフラグに変換することで解決しました。

あとがき

研究からの現実逃避がてら5~6日で作ったのでまだまだ改善の余地はありますが、やりたかったことは出来てきているのでこれから完成度を高めていきたいです💪