lua/josean/plugins/nvim-treesitter-text-objects.lua (6186B)
1 return {
2 "nvim-treesitter/nvim-treesitter-textobjects",
3 lazy = true,
4 config = function()
5 require("nvim-treesitter.configs").setup({
6 textobjects = {
7 select = {
8 enable = true,
9
10 -- Automatically jump forward to textobj, similar to targets.vim
11 lookahead = true,
12
13 keymaps = {
14 -- You can use the capture groups defined in textobjects.scm
15 ["a="] = { query = "@assignment.outer", desc = "Select outer part of an assignment" },
16 ["i="] = { query = "@assignment.inner", desc = "Select inner part of an assignment" },
17 ["l="] = { query = "@assignment.lhs", desc = "Select left hand side of an assignment" },
18 ["r="] = { query = "@assignment.rhs", desc = "Select right hand side of an assignment" },
19
20 -- works for javascript/typescript files (custom capture I created in after/queries/ecma/textobjects.scm)
21 ["a:"] = { query = "@property.outer", desc = "Select outer part of an object property" },
22 ["i:"] = { query = "@property.inner", desc = "Select inner part of an object property" },
23 ["l:"] = { query = "@property.lhs", desc = "Select left part of an object property" },
24 ["r:"] = { query = "@property.rhs", desc = "Select right part of an object property" },
25
26 ["aa"] = { query = "@parameter.outer", desc = "Select outer part of a parameter/argument" },
27 ["ia"] = { query = "@parameter.inner", desc = "Select inner part of a parameter/argument" },
28
29 ["ai"] = { query = "@conditional.outer", desc = "Select outer part of a conditional" },
30 ["ii"] = { query = "@conditional.inner", desc = "Select inner part of a conditional" },
31
32 ["al"] = { query = "@loop.outer", desc = "Select outer part of a loop" },
33 ["il"] = { query = "@loop.inner", desc = "Select inner part of a loop" },
34
35 ["af"] = { query = "@call.outer", desc = "Select outer part of a function call" },
36 ["if"] = { query = "@call.inner", desc = "Select inner part of a function call" },
37
38 ["am"] = { query = "@function.outer", desc = "Select outer part of a method/function definition" },
39 ["im"] = { query = "@function.inner", desc = "Select inner part of a method/function definition" },
40
41 ["ac"] = { query = "@class.outer", desc = "Select outer part of a class" },
42 ["ic"] = { query = "@class.inner", desc = "Select inner part of a class" },
43 },
44 },
45 swap = {
46 enable = true,
47 swap_next = {
48 ["<leader>na"] = "@parameter.inner", -- swap parameters/argument with next
49 ["<leader>n:"] = "@property.outer", -- swap object property with next
50 ["<leader>nm"] = "@function.outer", -- swap function with next
51 },
52 swap_previous = {
53 ["<leader>pa"] = "@parameter.inner", -- swap parameters/argument with prev
54 ["<leader>p:"] = "@property.outer", -- swap object property with prev
55 ["<leader>pm"] = "@function.outer", -- swap function with previous
56 },
57 },
58 move = {
59 enable = true,
60 set_jumps = true, -- whether to set jumps in the jumplist
61 goto_next_start = {
62 ["]f"] = { query = "@call.outer", desc = "Next function call start" },
63 ["]m"] = { query = "@function.outer", desc = "Next method/function def start" },
64 ["]c"] = { query = "@class.outer", desc = "Next class start" },
65 ["]i"] = { query = "@conditional.outer", desc = "Next conditional start" },
66 ["]l"] = { query = "@loop.outer", desc = "Next loop start" },
67
68 -- You can pass a query group to use query from `queries/<lang>/<query_group>.scm file in your runtime path.
69 -- Below example nvim-treesitter's `locals.scm` and `folds.scm`. They also provide highlights.scm and indent.scm.
70 ["]s"] = { query = "@scope", query_group = "locals", desc = "Next scope" },
71 ["]z"] = { query = "@fold", query_group = "folds", desc = "Next fold" },
72 },
73 goto_next_end = {
74 ["]F"] = { query = "@call.outer", desc = "Next function call end" },
75 ["]M"] = { query = "@function.outer", desc = "Next method/function def end" },
76 ["]C"] = { query = "@class.outer", desc = "Next class end" },
77 ["]I"] = { query = "@conditional.outer", desc = "Next conditional end" },
78 ["]L"] = { query = "@loop.outer", desc = "Next loop end" },
79 },
80 goto_previous_start = {
81 ["[f"] = { query = "@call.outer", desc = "Prev function call start" },
82 ["[m"] = { query = "@function.outer", desc = "Prev method/function def start" },
83 ["[c"] = { query = "@class.outer", desc = "Prev class start" },
84 ["[i"] = { query = "@conditional.outer", desc = "Prev conditional start" },
85 ["[l"] = { query = "@loop.outer", desc = "Prev loop start" },
86 },
87 goto_previous_end = {
88 ["[F"] = { query = "@call.outer", desc = "Prev function call end" },
89 ["[M"] = { query = "@function.outer", desc = "Prev method/function def end" },
90 ["[C"] = { query = "@class.outer", desc = "Prev class end" },
91 ["[I"] = { query = "@conditional.outer", desc = "Prev conditional end" },
92 ["[L"] = { query = "@loop.outer", desc = "Prev loop end" },
93 },
94 },
95 },
96 })
97
98 local ts_repeat_move = require("nvim-treesitter.textobjects.repeatable_move")
99
100 -- vim way: ; goes to the direction you were moving.
101 vim.keymap.set({ "n", "x", "o" }, ";", ts_repeat_move.repeat_last_move)
102 vim.keymap.set({ "n", "x", "o" }, ",", ts_repeat_move.repeat_last_move_opposite)
103
104 -- Optionally, make builtin f, F, t, T also repeatable with ; and ,
105 vim.keymap.set({ "n", "x", "o" }, "f", ts_repeat_move.builtin_f)
106 vim.keymap.set({ "n", "x", "o" }, "F", ts_repeat_move.builtin_F)
107 vim.keymap.set({ "n", "x", "o" }, "t", ts_repeat_move.builtin_t)
108 vim.keymap.set({ "n", "x", "o" }, "T", ts_repeat_move.builtin_T)
109 end,
110 }