Yet another label-based node selection plugin.
There are some cases that start or end of the node position overlaps with the other nodes. If labels are overlayed, there is a difficulty on selecting the intended one (e.g., nvim-treehopper or leap-ast.nvim). If labels are inserted inline, your eyes may fail to track the node (e.g., flash.nvim).
Instead, this plugin does...
- Label start of nodes with lower case letters and end of nodes with the corresponding upper case letters.
- Ask user to input a label.
- If there are any labels hidden by the chosen label, then ask again to choose the label from the subset of choises.
- Select the node of the choice.
It's like monkey hanging around the Abstract Syntax Tree. Isn't it?
vim.keymap.set({"x", "o"}, "m", function()
require("treemonkey").select({
ignore_injections = false,
highlight = { backdrop = "Comment" }
})
end)With lazy.nvim, ...
{
"https://github.com/atusy/treemonkey.nvim",
init = function()
vim.keymap.set({"x", "o"}, "m", function()
require("treemonkey").select({ ignore_injections = false })
end)
end
}The candidate nodes can be gathered from two interchangeable backends that share the same label-based selection engine:
treemonkey.treesittergathers nodes fromvim.treesitter(the default).treemonkey.getandtreemonkey.selectare aliases oftreemonkey.treesitter.getandtreemonkey.treesitter.select.treemonkey.lsp.selection_rangegathers ranges from a language server via thetextDocument/selectionRangerequest. It requires a language server withselectionRangeProviderattached to the buffer.
-- select based on the language server instead of treesitter
vim.keymap.set({ "x", "o" }, "m", function()
require("treemonkey.lsp.selection_range").select()
end)