nvim-treesitter-textobjects
Create your own textobjects using tree-sitter queries!
Installation
You can install nvim-treesitter-textobjects with your favorite package manager, or using the default pack feature of Neovim!
Using a package manager
If you are using vim-plug, put this in your init.vim file:
Plug 'nvim-treesitter/nvim-treesitter'
Plug 'nvim-treesitter/nvim-treesitter-textobjects'
Text objects: select
Define your own text objects mappings
similar to ip
(inner paragraph) and ap
(a paragraph).
lua <<EOF
require'nvim-treesitter.configs'.setup {
textobjects = {
select = {
enable = true,
keymaps = {
-- You can use the capture groups defined in textobjects.scm
["af"] = "@function.outer",
["if"] = "@function.inner",
["ac"] = "@class.outer",
["ic"] = "@class.inner",
-- Or you can define your own textobjects like this
["iF"] = {
python = "(function_definition) @function",
cpp = "(function_definition) @function",
c = "(function_definition) @function",
java = "(method_declaration) @function",
},
},
},
},
}
EOF
Text objects: swap
Define your own mappings to swap the node under the cursor with the next or previous one, like function parameters or arguments.
lua <<EOF
require'nvim-treesitter.configs'.setup {
textobjects = {
swap = {
enable = true,
swap_next = {
["<leader>a"] = "@parameter.inner",
},
swap_previous = {
["<leader>A"] = "@parameter.inner",
},
},
},
}
EOF
Text objects: move
Define your own mappings to jump to the next or previous text object.
This is similar to ]m
, [m
, ]M
, [M
Neovim's mappings to jump to the next
or previous function.
lua <<EOF
require'nvim-treesitter.configs'.setup {
textobjects = {
move = {
enable = true,
set_jumps = true, -- whether to set jumps in the jumplist
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",
},
},
},
}
EOF
Textobjects: LSP interop
- peek_definition_code: show textobject surrounding definition as determined using Neovim's built-in LSP in a floating window. Press the shortcut twice to enter the floating window (when neovim/neovim#12720 or its successor is merged)
lua <<EOF
require'nvim-treesitter.configs'.setup {
textobjects = {
lsp_interop = {
enable = true,
peek_definition_code = {
["df"] = "@function.outer",
["dF"] = "@class.outer",
},
},
},
}
EOF
Built-in Textobjects
- @block.inner
- @block.outer
- @call.inner
- @call.outer
- @class.inner
- @class.outer
- @comment.outer
- @conditional.inner
- @conditional.outer
- @frame.inner
- @frame.outer
- @function.inner
- @function.outer
- @loop.inner
- @loop.outer
- @parameter.inner
- @parameter.outer
- @statement.outer
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
bash | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | |||||||||||
beancount | ||||||||||||||||||
bibtex | 👍 | 👍 | ||||||||||||||||
c | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | ||||
c_sharp | 👍 | 👍 | ||||||||||||||||
clojure | ||||||||||||||||||
comment | ||||||||||||||||||
cpp | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | ||||
css | ||||||||||||||||||
dart | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | ||||
devicetree | ||||||||||||||||||
elm | ||||||||||||||||||
erlang | ||||||||||||||||||
fennel | ||||||||||||||||||
Godot (gdscript) | ||||||||||||||||||
Glimmer and Ember | ||||||||||||||||||
go | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | |||
graphql | ||||||||||||||||||
haskell | ||||||||||||||||||
html | 👍 | 👍 | 👍 | 👍 | ||||||||||||||
java | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | ||||||
javascript | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | |||||
jsdoc | ||||||||||||||||||
json | ||||||||||||||||||
JSON with comments | ||||||||||||||||||
julia | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | |||||||||||
kotlin | ||||||||||||||||||
latex | 👍 | 👍 | 👍 | 👍 | ||||||||||||||
ledger | ||||||||||||||||||
lua | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | |||||||||||
nix | ||||||||||||||||||
ocaml | ||||||||||||||||||
ocaml_interface | ||||||||||||||||||
ocamllex | ||||||||||||||||||
php | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | |||||||
python | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | |||
ql | 👍 | 👍 | 👍 | |||||||||||||||
Tree-sitter query language | ||||||||||||||||||
r | ||||||||||||||||||
regex | ||||||||||||||||||
rst | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | |||||||||||
ruby | ||||||||||||||||||
rust | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | ||||
scala | ||||||||||||||||||
scss | ||||||||||||||||||
sparql | ||||||||||||||||||
supercollider | ||||||||||||||||||
svelte | ||||||||||||||||||
swift | ||||||||||||||||||
teal | ||||||||||||||||||
toml | ||||||||||||||||||
tsx | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | |||||
turtle | ||||||||||||||||||
typescript | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | |||||
verilog | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | ||||||||||||
vue | ||||||||||||||||||
yaml | ||||||||||||||||||
zig |