nvim: add treesitter textobjects
This commit is contained in:
@@ -15,70 +15,134 @@ vim.api.nvim_create_autocmd("PackChanged", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
vim.pack.add({
|
vim.pack.add({
|
||||||
{ src = "https://github.com/nvim-treesitter/nvim-treesitter-textobjects", version = "master" },
|
{ src = "https://github.com/nvim-treesitter/nvim-treesitter-textobjects", version = "main" },
|
||||||
{ src = "https://github.com/nvim-treesitter/nvim-treesitter", version = "master" },
|
{ src = "https://github.com/nvim-treesitter/nvim-treesitter", version = "main" },
|
||||||
})
|
})
|
||||||
local ok, configs = pcall(require, "nvim-treesitter.configs")
|
local ok = pcall(require, "nvim-treesitter")
|
||||||
if ok then
|
if ok then
|
||||||
configs.setup({
|
vim.api.nvim_create_autocmd('FileType', {
|
||||||
highlight = {
|
pattern = { 'odin', 'go' },
|
||||||
enable = true,
|
callback = function() vim.treesitter.start() end,
|
||||||
},
|
|
||||||
textobjects = {
|
|
||||||
select = {
|
|
||||||
enable = true,
|
|
||||||
lookahead = true,
|
|
||||||
keymaps = {
|
|
||||||
["aa"] = "@parameter.outer",
|
|
||||||
["ia"] = "@parameter.inner",
|
|
||||||
["af"] = "@function.outer",
|
|
||||||
["if"] = "@function.inner",
|
|
||||||
["ac"] = "@class.outer",
|
|
||||||
["ic"] = "@class.inner",
|
|
||||||
["al"] = "@call.outer",
|
|
||||||
["il"] = "@call.inner",
|
|
||||||
["ao"] = "@loop.outer",
|
|
||||||
["io"] = "@loop.inner",
|
|
||||||
["ad"] = "@conditional.outer",
|
|
||||||
["id"] = "@conditional.inner",
|
|
||||||
["ar"] = "@return.outer",
|
|
||||||
["ir"] = "@return.inner",
|
|
||||||
["as"] = "@statement.outer",
|
|
||||||
["ag"] = "@assignment.outer",
|
|
||||||
["ig"] = "@assignment.inner",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
move = {
|
|
||||||
enable = true,
|
|
||||||
set_jumps = true,
|
|
||||||
goto_next_start = {
|
|
||||||
["]m"] = "@function.outer",
|
|
||||||
["]]"] = "@class.outer",
|
|
||||||
},
|
|
||||||
goto_next_end = {
|
|
||||||
["]M"] = "@function.outer",
|
|
||||||
["]["] = "@class.outer",
|
|
||||||
},
|
|
||||||
goto_previous_start = {
|
|
||||||
["[m"] = "@function.outer",
|
|
||||||
["[["] = "@class.outer",
|
|
||||||
},
|
|
||||||
goto_previous_end = {
|
|
||||||
["[M"] = "@function.outer",
|
|
||||||
["[]"] = "@class.outer",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
swap = {
|
|
||||||
enable = true,
|
|
||||||
swap_next = {
|
|
||||||
["<leader>cp"] = "@parameter.inner",
|
|
||||||
},
|
|
||||||
swap_previous = {
|
|
||||||
["<leader>cP"] = "@parameter.inner",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
else
|
else
|
||||||
print("plugin nvim-treesitter.configs missing")
|
print("plugin nvim-treesitter.configs missing")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local textobjects
|
||||||
|
ok, textobjects = pcall(require, "nvim-treesitter-textobjects")
|
||||||
|
if ok then
|
||||||
|
textobjects.setup {
|
||||||
|
move = {
|
||||||
|
set_jumps = true,
|
||||||
|
},
|
||||||
|
select = {
|
||||||
|
-- Automatically jump forward to textobj, similar to targets.vim
|
||||||
|
lookahead = true,
|
||||||
|
-- You can choose the select mode (default is charwise 'v')
|
||||||
|
--
|
||||||
|
-- Can also be a function which gets passed a table with the keys
|
||||||
|
-- * query_string: eg '@function.inner'
|
||||||
|
-- * method: eg 'v' or 'o'
|
||||||
|
-- and should return the mode ('v', 'V', or '<c-v>') or a table
|
||||||
|
-- mapping query_strings to modes.
|
||||||
|
selection_modes = {
|
||||||
|
['@parameter.outer'] = 'v', -- charwise
|
||||||
|
['@function.outer'] = 'V', -- linewise
|
||||||
|
-- ['@class.outer'] = '<c-v>', -- blockwise
|
||||||
|
},
|
||||||
|
-- If you set this to `true` (default is `false`) then any textobject is
|
||||||
|
-- extended to include preceding or succeeding whitespace. Succeeding
|
||||||
|
-- whitespace has priority in order to act similarly to eg the built-in
|
||||||
|
-- `ap`.
|
||||||
|
--
|
||||||
|
-- Can also be a function which gets passed a table with the keys
|
||||||
|
-- * query_string: eg '@function.inner'
|
||||||
|
-- * selection_mode: eg 'v'
|
||||||
|
-- and should return true of false
|
||||||
|
include_surrounding_whitespace = false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
local function key_select(key, object)
|
||||||
|
vim.keymap.set({ "x", "o" }, key, function()
|
||||||
|
require "nvim-treesitter-textobjects.select".select_textobject(object, "textobjects")
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
key_select("aa", "@parameter.outer")
|
||||||
|
key_select("ia", "@parameter.inner")
|
||||||
|
key_select("af", "@function.outer")
|
||||||
|
key_select("if", "@function.inner")
|
||||||
|
key_select("ac", "@class.outer")
|
||||||
|
key_select("ic", "@class.inner")
|
||||||
|
key_select("al", "@call.outer")
|
||||||
|
key_select("il", "@call.inner")
|
||||||
|
key_select("ao", "@loop.outer")
|
||||||
|
key_select("io", "@loop.inner")
|
||||||
|
key_select("ad", "@conditional.outer")
|
||||||
|
key_select("id", "@conditional.inner")
|
||||||
|
key_select("ar", "@return.outer")
|
||||||
|
key_select("ir", "@return.inner")
|
||||||
|
key_select("as", "@statement.outer")
|
||||||
|
key_select("ag", "@assignment.outer")
|
||||||
|
key_select("ig", "@assignment.inner")
|
||||||
|
|
||||||
|
vim.keymap.set({ "x", "o" }, "ax", function()
|
||||||
|
require "nvim-treesitter-textobjects.select".select_textobject("@local.scope", "locals")
|
||||||
|
end)
|
||||||
|
vim.keymap.set("n", "<leader>cp", function()
|
||||||
|
require("nvim-treesitter-textobjects.swap").swap_next "@parameter.inner"
|
||||||
|
end)
|
||||||
|
vim.keymap.set("n", "<leader>cP", function()
|
||||||
|
require("nvim-treesitter-textobjects.swap").swap_previous "@parameter.inner"
|
||||||
|
end)
|
||||||
|
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "]m", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_next_start("@function.outer", "textobjects")
|
||||||
|
end)
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "]]", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_next_start("@class.outer", "textobjects")
|
||||||
|
end)
|
||||||
|
-- You can also pass a list to group multiple queries.
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "]o", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_next_start({ "@loop.inner", "@loop.outer" },
|
||||||
|
"textobjects")
|
||||||
|
end)
|
||||||
|
-- You can also use captures from other query groups like `locals.scm` or `folds.scm`
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "]s", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_next_start("@local.scope", "locals")
|
||||||
|
end)
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "]z", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_next_start("@fold", "folds")
|
||||||
|
end)
|
||||||
|
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "]M", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_next_end("@function.outer", "textobjects")
|
||||||
|
end)
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "][", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_next_end("@class.outer", "textobjects")
|
||||||
|
end)
|
||||||
|
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "[m", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_previous_start("@function.outer", "textobjects")
|
||||||
|
end)
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "[[", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_previous_start("@class.outer", "textobjects")
|
||||||
|
end)
|
||||||
|
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "[M", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_previous_end("@function.outer", "textobjects")
|
||||||
|
end)
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "[]", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_previous_end("@class.outer", "textobjects")
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Go to either the start or the end, whichever is closer.
|
||||||
|
-- Use if you want more granular movements
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "]d", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_next("@conditional.outer", "textobjects")
|
||||||
|
end)
|
||||||
|
vim.keymap.set({ "n", "x", "o" }, "[d", function()
|
||||||
|
require("nvim-treesitter-textobjects.move").goto_previous("@conditional.outer", "textobjects")
|
||||||
|
end)
|
||||||
|
else
|
||||||
|
print("plugin nvim-treesitter-textobjects missing")
|
||||||
|
end
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"LuaSnip": {
|
"LuaSnip": {
|
||||||
"rev": "5a1e39223db9a0498024a77b8441169d260c8c25",
|
"rev": "642b0c595e11608b4c18219e93b88d7637af27bc",
|
||||||
"src": "https://github.com/L3MON4D3/LuaSnip",
|
"src": "https://github.com/L3MON4D3/LuaSnip",
|
||||||
"version": "2.0.0 - 3.0.0"
|
"version": "2.0.0 - 3.0.0"
|
||||||
},
|
},
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
"src": "https://github.com/rmagatti/auto-session"
|
"src": "https://github.com/rmagatti/auto-session"
|
||||||
},
|
},
|
||||||
"conform.nvim": {
|
"conform.nvim": {
|
||||||
"rev": "c2526f1cde528a66e086ab1668e996d162c75f4f",
|
"rev": "086a40dc7ed8242c03be9f47fbcee68699cc2395",
|
||||||
"src": "https://github.com/stevearc/conform.nvim"
|
"src": "https://github.com/stevearc/conform.nvim"
|
||||||
},
|
},
|
||||||
"flash.nvim": {
|
"flash.nvim": {
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
"src": "https://github.com/kepano/flexoki-neovim"
|
"src": "https://github.com/kepano/flexoki-neovim"
|
||||||
},
|
},
|
||||||
"fzf-lua": {
|
"fzf-lua": {
|
||||||
"rev": "d9908fd0a5474994f00526ed17f0b77339dc0152",
|
"rev": "9f0432fdd7825ab163520045831a40b6df82ea28",
|
||||||
"src": "https://github.com/ibhagwan/fzf-lua"
|
"src": "https://github.com/ibhagwan/fzf-lua"
|
||||||
},
|
},
|
||||||
"fzf-lua-frecency.nvim": {
|
"fzf-lua-frecency.nvim": {
|
||||||
@@ -45,8 +45,12 @@
|
|||||||
"rev": "9c60ec2279d62487d942ce095e49006af28eed6e",
|
"rev": "9c60ec2279d62487d942ce095e49006af28eed6e",
|
||||||
"src": "https://github.com/rktjmp/lush.nvim"
|
"src": "https://github.com/rktjmp/lush.nvim"
|
||||||
},
|
},
|
||||||
|
"miasma.nvim": {
|
||||||
|
"rev": "627f2e1cac91de0d1d4dd7472b506a30f41b2b7d",
|
||||||
|
"src": "https://github.com/xero/miasma.nvim"
|
||||||
|
},
|
||||||
"multicursor.nvim": {
|
"multicursor.nvim": {
|
||||||
"rev": "630dd29dd696bc977cb81d7dd2fa6bb280f60fc4",
|
"rev": "704b99f10a72cc05d370cfeb294ff83412a8ab55",
|
||||||
"src": "https://github.com/jake-stewart/multicursor.nvim",
|
"src": "https://github.com/jake-stewart/multicursor.nvim",
|
||||||
"version": "'1.0'"
|
"version": "'1.0'"
|
||||||
},
|
},
|
||||||
@@ -60,29 +64,29 @@
|
|||||||
"version": "3.0.0 - 4.0.0"
|
"version": "3.0.0 - 4.0.0"
|
||||||
},
|
},
|
||||||
"nvim-treesitter": {
|
"nvim-treesitter": {
|
||||||
"rev": "42fc28ba918343ebfd5565147a42a26580579482",
|
"rev": "4916d6592ede8c07973490d9322f187e07dfefac",
|
||||||
"src": "https://github.com/nvim-treesitter/nvim-treesitter",
|
"src": "https://github.com/nvim-treesitter/nvim-treesitter",
|
||||||
"version": "'master'"
|
"version": "'main'"
|
||||||
},
|
},
|
||||||
"nvim-treesitter-textobjects": {
|
"nvim-treesitter-textobjects": {
|
||||||
"rev": "5ca4aaa6efdcc59be46b95a3e876300cfead05ef",
|
"rev": "851e865342e5a4cb1ae23d31caf6e991e1c99f1e",
|
||||||
"src": "https://github.com/nvim-treesitter/nvim-treesitter-textobjects",
|
"src": "https://github.com/nvim-treesitter/nvim-treesitter-textobjects",
|
||||||
"version": "'master'"
|
"version": "'main'"
|
||||||
},
|
},
|
||||||
"nvim-various-textobjs": {
|
"nvim-various-textobjs": {
|
||||||
"rev": "34ca4f6b54cf167554c5792cacc69c930b654136",
|
"rev": "e049b24fc2042a424843a8db79af5ceb273be6f6",
|
||||||
"src": "https://github.com/chrisgrieser/nvim-various-textobjs"
|
"src": "https://github.com/chrisgrieser/nvim-various-textobjs"
|
||||||
},
|
},
|
||||||
"oil.nvim": {
|
"oil.nvim": {
|
||||||
"rev": "f55b25e493a7df76371cfadd0ded5004cb9cd48a",
|
"rev": "0fcc83805ad11cf714a949c98c605ed717e0b83e",
|
||||||
"src": "https://github.com/stevearc/oil.nvim"
|
"src": "https://github.com/stevearc/oil.nvim"
|
||||||
},
|
},
|
||||||
"slimline.nvim": {
|
"slimline.nvim": {
|
||||||
"rev": "6b1f20780a26813ba3c2f248c6c6f61e7281bb7b",
|
"rev": "2ca5a979698fd0af0406770fa5dc81899fb53106",
|
||||||
"src": "https://github.com/sschleemilch/slimline.nvim"
|
"src": "https://github.com/sschleemilch/slimline.nvim"
|
||||||
},
|
},
|
||||||
"snacks.nvim": {
|
"snacks.nvim": {
|
||||||
"rev": "fe7cfe9800a182274d0f868a74b7263b8c0c020b",
|
"rev": "ad9ede6a9cddf16cedbd31b8932d6dcdee9b716e",
|
||||||
"src": "https://github.com/folke/snacks.nvim"
|
"src": "https://github.com/folke/snacks.nvim"
|
||||||
},
|
},
|
||||||
"which-key.nvim": {
|
"which-key.nvim": {
|
||||||
@@ -94,4 +98,4 @@
|
|||||||
"src": "https://github.com/zenbones-theme/zenbones.nvim"
|
"src": "https://github.com/zenbones-theme/zenbones.nvim"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user