treemonkey.nvimというプラグインを作りました。
treesitterを活用し、カーソル位置に対応するノード(変数とか関数とか)を選択するプラグインです。
ノードの開始位置と終了位置に対応するラベルがあるので、自分が選択したい範囲に対応するラベルを選ぶ形式です。
設定は簡単で、以下のようにマッピングしておくだけ。
vim.keymap.set({"x", "o"}, "m", function()
require("treemonkey").select({ ignore_injections = false })
end)
同様のプラグインとしては、nvim-treehopperやleap-ast.nvim、flash.nvimがあります。
しかし、これらのプラグインは、ラベルが重複する場合の扱いに難がありました。
たとえばnvim-treehopperやleap-ast.nvimでは、下の画像のb
というラベルの下にa
やc
のラベルも隠れています。
a
:local
句b
:local ok, res = pcall(vim.fn.getcharstr)
という1行のブロックc
:getcharstr
関数のbody部分
このため、実際にはc
を選択する場面でも、開始位置だけに注目しているとb
を入力しがちです。
flash.nvimではラベルをコードに重ねずにインラインに挿入することで、ラベルが隠れる状況を防ぐ設計になっています。
一見よさそうですが、ラベルが多いと文字のずれが大きくなるため、選択したい範囲を見失いがちです。
これに対し、treemonkey.nvimでは選択したラベルが他のラベルを隠している場合に、もう1度、選択を要求する仕組みになっています。
1段階目ではnvim-treehopperと同様に、ラベルが重なりあっています。
ここでa
を選択すると、ノードの開始位置に対応する小文字ラベルはa
のみが残り、終端位置に対応する大文字ラベルはa
ラベルを開始位置に持つA
とB
に絞り込まれます。
あとはA
でもB
でも好きな方を入力すればOK。
もし、重複するラベルがない場合には1度目の入力で選択完了します。
treemonkey.nvimという名前は、どこへ行こうかと木にぶらさがってるおサルさんのイメージからつけました。
ENJOY!