Telescope.nvimのpickerをさらにカスタマイズする

March 10, 2024

はじめに

Telescope.nvimという拡張の見た目に関して以前記事にしたようなカスタマイズを加えていたのですが、grepを用いた際の検索結果をファイルごとにグルーピングして表示できないかなと考えていました。そんなときにtelescope-egrepifyをいうプラグインを見つけました。

ファイルごとにグルーピングして表示するだけでなく、prefixを導入することでより柔軟で表現力の高いqueryを使えるように実装されています。詳細はREADMEを見てほしいのですが、AND/ORを切り替えられたり、ファイルの拡張子などを絞って検索ができるようになっています。

メンテナンスコストの増加につながるような機能追加は各々でforkしたリポジトリに対して行うことが推奨されていました。今回行ったのはそれほど大きな変更ではないですが、使っているうちにどんどんカスタマイズしたくなるものだと思うのでforkしましょう。(といっても自分のdotfilesに組み込んでしまったのですが。)

ハイライトを追加した

少し前に記事にしたハイライトを追加しました。ディレクトリ名とファイル名に異なるハイライトを適用しています。

ファイル単位の並び順をマッチした行番号の昇順にした

prompを下に表示しているのですが、ぱっと見で見やすいと感じたので見たままの状態で昇順になるようにしました。上から見ていったときに行番号が昇順になっている状態です。Telescopeにはsorting_strategyという項目が用意されており、これをよしなに設定してあげることでうまくいかないかなと考えました。ところがページ送りが発生すると機能はするのですが見た目が崩れてしまいました。加えてこのオプションはtelescopeのデフォルトの挙動を指定するもので、他のpickerに影響が出ることが考えられました。

そのため他の方法で実現することにしました。Telescopeではカスタムのpickerを作成する際にtiebreakというオプションを指定することができます。この項目ではpickerに入力されたentryの表示順を決定するsorterから同じスコアが返された場合の振る舞いを別途指定する事ができます。デフォルトではentryのordinalに指定された値の長さで決まります。詳細の説明はコードを見たほうが簡潔なので、該当部分のコードを載せるだけに留めます。

tiebreak = function(current, existing) if current.filename == existing.filename then if existing.kind == "begin" then return true else if existing.lnum < current.lnum then return true else return false end end end end

スクリーンショット

さいごに

このプラグインの実装を読んで初めてripgrepコマンドの結果をjson形式で出力できることを知りました。便利ですね。色々なツールに組み込んで使えそうです。