telescope.nvimによるjumplistをちょっと便利にするテク

by

Vimアドベントカレンダー12/10の記事です。
昨日の記事は以下の2本でした。

TelescopeはNeovimにおけるFuzzy Finderのデファクトの座を勝ち取っていると思います。
便利な一方、痒いところに手を出すと途端に難解でundocumentedなAPIに手を出す羽目になります……。

ということで、Telescopeを使ったjumplistをちょっと便利にする小技を紹介します。

Jumplistは文字通り、Vim/Neovim上でjumpした履歴をもっています。
<C-O>で直前の履歴へ、<C-I>で直後の履歴へ飛べます。

基本はこれらで十分ですが、定義ジャンプであちこち飛んだ後など、特定の場所に戻りたいがどの程度前かわからない場合にFuzzy Finderが輝きます。
しかし、:Telescope jumplist実行時はジャンプリスト上の最後の履歴にカーソルがあっており、現在位置との相対的関係がわかりません。

以下のように、現在のカーソル位置がジャンプリストの何番目にあるか判断し、そこにカーソルを動かすハックを仕込んでおくと便利です。

vim.keymap.set("n", "<space>j", function()
  local jumplist = vim.fn.getjumplist()
  require("telescope.builtin").jumplist({
    on_complete = {
      function(self)
        -- select current
        local n = #jumplist[1]
        if n ~= jumplist[2] then
          self:move_selection(jumplist[2] - #jumplist[1] + 1)
        end
      end,
    },
  })
end)

TelescopeのUI展開時のカーソル位置から、必要な場所への相対値を探ってmove_selection()するなかなかのHACK。
ほんとはUIに表示されている候補を総当たりして、妥当な場所にset_selection()する方がよさそうな気がするのですが、例によってAPIの難解さに破れました。
ここをなんとかできたら本家にPRしたいところ。

ENJOY