Telescope.nvimのpickerをさらにカスタマイズする
はじめに
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形式で出力できることを知りました。便利ですね。色々なツールに組み込んで使えそうです。