1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
return {
"nvim-treesitter/nvim-treesitter",
dependencies = {
"nvim-treesitter/nvim-treesitter-textobjects",
},
build = ":TSUpdate",
event = { "BufReadPre", "BufNewFile" },
opts = {
-- List of parsers to install automatically
ensure_installed = { "lua", "vim", "vimdoc", "python", "json", "toml", "yaml", "bash", "javascript" },
auto_install = true,
highlight = {
enable = true,
-- Setting this to true will run `:h syntax` and tree-sitter at the same time.
-- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
-- Using this option may slow down your editor, and you may see some duplicate highlights.
-- Instead of true it can also be a list of languages
additional_vim_regex_highlighting = false,
},
indent = {
-- Syntax-aware indentation with the = operator
enable = true,
},
incremental_selection = {
enable = true,
keymaps = {
init_selection = "<leader>vn",
node_incremental = "n",
node_decremental = "<S-n>",
scope_incremental = false,
},
},
textobjects = {
move = {
enable = true,
-- Add jumps to the jumplist for navigating with Ctrl+I/O
set_jumps = true,
goto_next_start = {
["]m"] = { query = "@call.outer", desc = "Next method/function call start" },
["]f"] = { query = "@function.outer", desc = "Next function def start" },
["]c"] = { query = "@class.outer", desc = "Next class start" },
["]i"] = { query = "@conditional.outer", desc = "Next conditional start" },
["]l"] = { query = "@loop.outer", desc = "Next loop start" },
-- You can pass a query group to use query from `queries/<lang>/<query_group>.scm file in your runtime path.
-- Below example nvim-treesitter's `locals.scm` and `folds.scm`. They also provide highlights.scm and indent.scm.
["]s"] = { query = "@scope", query_group = "locals", desc = "Next scope" },
["]z"] = { query = "@fold", query_group = "folds", desc = "Next fold" },
},
goto_next_end = {
["]M"] = { query = "@call.outer", desc = "Next method/function call end" },
["]F"] = { query = "@function.outer", desc = "Next function def end" },
["]C"] = { query = "@class.outer", desc = "Next class end" },
["]I"] = { query = "@conditional.outer", desc = "Next conditional end" },
["]L"] = { query = "@loop.outer", desc = "Next loop end" },
},
goto_previous_start = {
["[m"] = { query = "@call.outer", desc = "Previous method/function call start" },
["[f"] = { query = "@function.outer", desc = "Previous function def start" },
["[c"] = { query = "@class.outer", desc = "Previous class start" },
["[i"] = { query = "@conditional.outer", desc = "Previous conditional start" },
["[l"] = { query = "@loop.outer", desc = "Previous loop start" },
},
goto_previous_end = {
["[M"] = { query = "@call.outer", desc = "Previous method/function call end" },
["[F"] = { query = "@function.outer", desc = "Previous function def end" },
["[C"] = { query = "@class.outer", desc = "Previous class end" },
["[I"] = { query = "@conditional.outer", desc = "Previous conditional end" },
["[L"] = { query = "@loop.outer", desc = "Previous loop end" },
},
},
select = {
enable = true,
-- automatically jump forward to a text object if the
-- cursor isn't on one when triggering the plugin
lookahead = true,
keymaps = {
-- Use = as an "assignment" text object
["a="] = { query = "@assignment.outer", desc = "Select outer part of an assignment" },
["i="] = { query = "@assignment.inner", desc = "Select inner part of an assignment" },
["l="] = { query = "@assignment.lhs", desc = "Select left hand side of an assignment" },
["r="] = { query = "@assignment.rhs", desc = "Select right hand side of an assignment" },
-- Use "a" for "argument"
["aa"] = { query = "@parameter.outer", desc = "Select outer part of an argument / parameter" },
["ia"] = { query = "@parameter.inner", desc = "Select inner part of an argument / parameter" },
-- Use "i" for "conditional" (saving c for class)
["ai"] = { query = "@conditional.outer", desc = "Select outer part of a conditional" },
["ii"] = { query = "@conditional.inner", desc = "Select inner part of a conditional" },
-- Use "l" for "loop"
["al"] = { query = "@loop.outer", desc = "Select outer part of a loop" },
["ij"] = { query = "@loop.inner", desc = "Select inner part of a loop" },
-- Use "f" for "function definition" (body of a function)
["af"] = { query = "@function.outer", desc = "Select outer part of a function definition" },
["if"] = { query = "@function.inner", desc = "Select inner part of a function definition" },
-- Use "m" for "method call" (invocation of a function)
["am"] = { query = "@call.outer", desc = "Select outer part of a method/function call" },
["im"] = { query = "@call.inner", desc = "Select inner part of a method/function call" },
-- Use "c" for "class"
["ac"] = { query = "@class.outer", desc = "Select outer part of a class" },
["ic"] = { query = "@class.inner", desc = "Select inner part of a class" },
},
},
swap = {
enable = true,
swap_next = {
["<leader>na"] = "@parameter.inner", -- Swap parameter with next
["<leader>nf"] = "@function.outer", -- Swap function with next
},
swap_previous = {
["<leader>pa"] = "@parameter.inner", -- Swap parameter with previous
["<leader>pf"] = "@function.outer", -- Swap function with previous
},
},
},
},
config = function(_, opts)
require("nvim-treesitter.configs").setup(opts)
vim.opt.foldmethod = "expr"
vim.opt.foldexpr = "nvim_treesitter#foldexpr()"
end,
}
|