Neovimで文法に従ってコードを範囲選択するtreemonkey.nvimを作った

by
カテゴリ:

treemonkey.nvimというプラグインを作りました。

treesitterを活用し、カーソル位置に対応するノード(変数とか関数とか)を選択するプラグインです。
ノードの開始位置と終了位置に対応するラベルがあるので、自分が選択したい範囲に対応するラベルを選ぶ形式です。

設定は簡単で、以下のようにマッピングしておくだけ。

vim.keymap.set({"x", "o"}, "m", function()
  require("treemonkey").select({ ignore_injections = false })
end)

同様のプラグインとしては、nvim-treehopperleap-ast.nvimflash.nvimがあります。
しかし、これらのプラグインは、ラベルが重複する場合の扱いに難がありました。

たとえばnvim-treehopperleap-ast.nvimでは、下の画像のbというラベルの下にacのラベルも隠れています。

このため、実際にはcを選択する場面でも、開始位置だけに注目しているとbを入力しがちです。

flash.nvimではラベルをコードに重ねずにインラインに挿入することで、ラベルが隠れる状況を防ぐ設計になっています。
一見よさそうですが、ラベルが多いと文字のずれが大きくなるため、選択したい範囲を見失いがちです。

これに対し、treemonkey.nvimでは選択したラベルが他のラベルを隠している場合に、もう1度、選択を要求する仕組みになっています。

1段階目ではnvim-treehopperと同様に、ラベルが重なりあっています。
ここでaを選択すると、ノードの開始位置に対応する小文字ラベルはaのみが残り、終端位置に対応する大文字ラベルはaラベルを開始位置に持つABに絞り込まれます。
あとはAでもBでも好きな方を入力すればOK。
もし、重複するラベルがない場合には1度目の入力で選択完了します。

treemonkey.nvimという名前は、どこへ行こうかと木にぶらさがってるおサルさんのイメージからつけました。

ENJOY!