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

October 22, 2023

はじめに

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形式で出力できることを知りました。 便利ですね。 色々なツールに組み込んで使えそうです。