2020-07-06 23:02:08 +02:00

Traditionnal highlighting (left) vs Treesitter-based highlighting (right).
2020-04-22 17:17:21 +02:00
[](https://gitter.im/nvim-treesitter/community?utm_source=badge& utm_medium=badge& utm_campaign=pr-badge)
2020-07-09 22:41:34 +02:00

2020-07-15 07:55:02 +02:00

2020-04-18 17:32:14 +02:00
# nvim-treesitter
2020-04-22 17:17:21 +02:00
Treesitter configurations and abstraction layer for Neovim.
2020-06-21 17:39:58 +02:00
**Warning: Treesitter and Treesitter highlighting are an experimental feature of nightly versions of Neovim.
Please consider the experience with this plug-in as experimental until Neovim 0.5 is released!**
2020-04-22 17:17:21 +02:00
# Quickstart
## Requirements
2020-04-22 19:36:10 +02:00
- Neovim [nightly ](https://github.com/neovim/neovim#install-from-source )
- `git` in your path.
- A C compiler in your path.
2020-04-22 17:17:21 +02:00
## Installation
2020-04-23 12:51:00 -04:00
You can install `nvim-treesitter` with your favorite package manager, or using the default `pack` feature of Neovim!
2020-04-22 17:17:21 +02:00
### Using a package manager
Simply add these lines to your `init.vim` :
```vim
Plug 'nvim-treesitter/nvim-treesitter'
```
### Using neovim `pack` feature
2020-04-22 19:36:10 +02:00
We highly recommend reading `:h packages` to learn more about this feature, but you can still follow these steps:
2020-04-22 17:17:21 +02:00
```sh
$ mkdir -p ~/.local/share/nvim/site/pack/nvim-treesitter/start
$ cd ~/.local/share/nvim/site/pack/nvim-treesitter/start
$ git clone https://github.com/nvim-treesitter/nvim-treesitter.git
```
## Adding parsers
2020-07-02 10:26:53 -05:00
Treesitter is using a different _parser_ for every language. It can be quite a pain to install, but fortunately `nvim-treesitter`
2020-04-22 19:36:10 +02:00
provides two command to tackle this issue:
2020-06-27 12:43:19 +02:00
- `TSInstall` to install one or more parser. You can use `TSInstall all` to download all parsers.
2020-04-22 17:17:21 +02:00
- `TSInstallInfo` to know which parser is installed.
2020-04-22 19:46:57 +02:00
Let's say you need parsers for `lua` , `c` , and `python` , this is how you do with these commands:
2020-04-22 17:17:21 +02:00
```vim
:TSInstall c
Downloading...
Compiling...
Treesitter parser for c has been installed
:TSInstall lua
Downloading...
Compiling...
Treesitter parser for lua has been installed
:TSInstall python
Downloading...
Compiling...
Treesitter parser for python has been installed
```
2020-04-22 19:47:09 +02:00
Cool, lets see which parsers are installed:
2020-04-22 17:17:21 +02:00
```vim
:TSInstallInfo
csharp [✗] not installed
html [✗] not installed
typescript [✗] not installed
c [✓] installed
swift [✗] not installed
java [✗] not installed
python [✓] installed
cpp [✗] not installed
lua [✓] installed
ruby [✗] not installed
ocaml [✗] not installed
go [✗] not installed
rust [✗] not installed
json [✗] not installed
javascript [✗] not installed
css [✗] not installed
julia [✗] not installed
php [✗] not installed
bash [✗] not installed
tsx [✗] not installed
```
2020-04-23 12:51:00 -04:00
And now you should be able to use every functionality `nvim-treesitter` provides!
2020-04-22 17:17:21 +02:00
2020-04-28 11:56:00 +02:00
## Setup
in your `init.vim` :
```lua
lua < < EOF
require'nvim-treesitter.configs'.setup {
highlight = {
2020-05-08 11:22:59 +02:00
enable = true, -- false will disable the whole extension
disable = { 'c', 'rust' }, -- list of language that will be disabled
2020-07-12 14:51:11 +02:00
custom_captures = { -- mapping of user defined captures to highlight groups
-- ["foo.bar"] = "Identifier" -- highlight own capture @foo .bar with highlight group "Identifier", see :h nvim-treesitter-query-extensions
},
2020-04-28 11:56:00 +02:00
},
2020-05-08 11:22:59 +02:00
incremental_selection = {
2020-04-28 11:56:00 +02:00
enable = true,
disable = { 'cpp', 'lua' },
keymaps = { -- mappings for incremental selection (visual mappings)
2020-05-08 11:22:59 +02:00
init_selection = 'gnn', -- maps in normal mode to init the node/scope selection
node_incremental = "grn", -- increment to the upper named parent
scope_incremental = "grc", -- increment to the upper scope (as defined in locals.scm)
2020-06-29 09:58:51 -05:00
node_decremental = "grm", -- decrement to the previous node
2020-04-28 11:56:00 +02:00
}
2020-05-01 12:26:57 +02:00
},
2020-06-29 09:58:51 -05:00
refactor = {
2020-07-10 18:45:02 -05:00
highlight_definitions = {
2020-06-29 09:58:51 -05:00
enable = true
},
2020-07-12 16:11:31 +02:00
highlight_current_scope = {
enable = true
},
2020-06-29 09:58:51 -05:00
smart_rename = {
enable = true,
2020-07-10 19:04:29 -05:00
keymaps = {
smart_rename = "grr" -- mapping to rename reference under cursor
}
2020-06-29 09:58:51 -05:00
},
navigation = {
enable = true,
2020-07-10 19:04:29 -05:00
keymaps = {
goto_definition = "gnd", -- mapping to go to definition of symbol under cursor
list_definitions = "gnD" -- mapping to list all definitions in current file
}
2020-06-29 09:58:51 -05:00
}
},
2020-07-04 17:15:04 +02:00
textobjects = { -- syntax-aware textobjects
enable = true,
disable = {},
keymaps = {
["iL"] = { -- you can define your own textobjects directly here
python = "(function_definition) @function ",
cpp = "(function_definition) @function ",
c = "(function_definition) @function ",
java = "(method_declaration) @function "
},
-- or you use the queries from supported languages with textobjects.scm
["af"] = "@function .outer",
["if"] = "@function .inner",
["aC"] = "@class .outer",
["iC"] = "@class .inner",
["ac"] = "@conditional .outer",
["ic"] = "@conditional .inner",
["ae"] = "@block .outer",
["ie"] = "@block .inner",
["al"] = "@loop .outer",
["il"] = "@loop .inner",
["is"] = "@statement .inner",
["as"] = "@statement .outer",
["ad"] = "@comment .outer",
["am"] = "@call .outer",
["im"] = "@call .inner"
}
},
2020-05-01 12:26:57 +02:00
ensure_installed = 'all' -- one of 'all', 'language', or a list of languages
2020-04-28 11:56:00 +02:00
}
EOF
```
## Commands
Each feature can be enabled or disabled by different means:
```vim
:TSBufEnable {module} " enable module on current buffer
:TSBufDisable {module} " disable module on current buffer
:TSEnableAll {module} [{ft}] " enable module on every buffer. If filetype is specified, enable only for this filetype.
:TSDisableAll {module} [{ft}] " disable module on every buffer. If filetype is specified, disable only for this filetype.
:TSModuleInfo [{module}] " list information about modules state for each filetype
```
2020-04-22 17:17:21 +02:00
## Features and Roadmap
2020-04-23 12:51:00 -04:00
The goal of `nvim-treesitter` is both to provide a simple and easy way to use the interface for Treesitter in Neovim,
but also to add some functionalities to it:
2020-04-22 17:17:21 +02:00
Some of these features are :
2020-04-28 11:56:00 +02:00
- [x] Incremental selection
2020-05-26 19:27:25 +02:00
- [x] Syntax based code folding (`set foldmethod=expr foldexpr=nvim_treesitter#foldexpr()` )
2020-04-28 11:56:00 +02:00
- [x] Consistent syntax highlighting (the api is not quite stable yet)
2020-05-07 08:18:13 +02:00
- [x] Statusline indicator (`require'nvim-treesitter'.statusline(size)` )
2020-04-22 17:17:21 +02:00
2020-04-22 19:36:10 +02:00
You can find the roadmap [here ](https://github.com/nvim-treesitter/nvim-treesitter/projects/1 ).
2020-04-23 12:51:00 -04:00
The roadmap and all features of this plugin are open to change, and any suggestion will be highly appreciated!
2020-04-22 17:17:21 +02:00
2020-06-29 09:58:51 -05:00
## Available Modules
- `highlight` : Consistent syntax highlighting.
- `incremental_selection` : Syntax based selection.
- `refactor.highlight_definitions` : Syntax based definition and usage highlighting.
- `refactor.smart_rename` : Syntax based definition and usage renaming.
- `refactor.navigation` : Syntax based definition listing and navigation.
* List all definitions
* Go to definition
2020-07-04 17:15:04 +02:00
- `textobjects` : Vim textobjects defined by treesitter queries
2020-06-29 09:58:51 -05:00
2020-07-02 10:26:53 -05:00
## Defining Modules
Users and plugin authors can take advantage of modules by creating their own. Modules provide:
- Treesitter language detection support
- Attach and detach to buffers
- Works with all nvim-treesitter commands
You can use the `define_modules` function to define one or more modules or module groups.
```lua
require 'nvim-treesitter'.define_modules {
my_cool_plugin = {
attach = function(bufnr, lang)
-- Do cool stuff here
end,
detach = function(bufnr)
-- Undo cool stuff here
end,
is_supported = function(lang)
-- Check if the language is supported
end
}
}
```
Modules can consist of the following properties:
- `module_path` : A require path (string) that exports a module with an `attach` and `detach` function. This is not required if the functions are on this definition.
- `enable` : Determines if the module is enabled by default. This is usually overridden by the user.
- `disable` : A list of languages that this module is disabled for. This is usually overridden by the user.
- `is_supported` : A function that takes a language and determines if this module supports that language.
- `attach` : A function that attachs to a buffer. This is required if `module_path` is not provided.
- `detach` : A function that detaches from a buffer. This is required if `module_path` is not provided.
2020-06-19 13:51:09 +02:00
## Utils
2020-05-15 14:19:29 +02:00
2020-06-19 13:51:09 +02:00
you can get some utility functions with
2020-05-15 14:19:29 +02:00
```lua
2020-06-19 13:51:09 +02:00
local ts_utils = require 'nvim-treesitter.ts_utils'
2020-05-15 14:19:29 +02:00
```
2020-06-19 14:13:23 +02:00
More information is available in the help file (`:help nvim-treesitter-utils` ).
2020-05-15 14:19:29 +02:00
2020-04-28 11:56:00 +02:00
## Supported Languages
2020-07-04 17:15:04 +02:00
For `nvim-treesitter` to work, we need to use query files such as those you can find in
2020-06-21 20:38:00 +02:00
`queries/{lang}/{locals,highlights,textobjects}.scm`
2020-04-28 11:56:00 +02:00
We are looking for maintainers to write query files for their languages.
List of currently supported languages:
- [x] lua (maintained by @vigoux )
- [x] ruby (maintained by @TravonteD )
2020-05-16 14:46:56 +02:00
- [x] c (maintained by @vigoux )
2020-07-18 01:12:03 +07:00
- [x] go (maintained by @theHamsta , @WinWisely268 )
2020-05-23 21:02:43 +02:00
- [x] cpp (maintained by @theHamsta , extends C queries)
2020-07-09 21:28:10 +02:00
- [x] rust (partial support, maintained by @vigoux )
2020-05-15 18:49:21 +02:00
- [x] python (maintained by @theHamsta )
2020-06-12 07:41:20 -05:00
- [x] javascript (maintained by @steelsojka )
- [x] typescript (maintained by @steelsojka )
2020-04-28 11:56:00 +02:00
- [ ] tsx
2020-06-15 13:13:26 -05:00
- [x] json (maintained by @steelsojka )
2020-05-30 10:50:03 -04:00
- [x] html (maintained by @TravonteD )
2020-07-19 13:33:48 -07:00
- [x] csharp (maintained by @svermeulen )
2020-04-28 11:56:00 +02:00
- [ ] swift
2020-06-15 23:12:20 +05:30
- [x] java
2020-04-28 11:56:00 +02:00
- [ ] ocaml
2020-05-30 10:51:13 -04:00
- [x] css (maintained by @TravonteD )
2020-04-28 11:56:00 +02:00
- [ ] julia
- [ ] php
2020-06-22 17:39:54 -04:00
- [x] bash (maintained by @TravonteD )
2020-05-07 08:18:13 +02:00
- [ ] scala
- [ ] haskell
- [ ] toml
- [ ] vue
- [ ] elm
- [ ] yaml
- [ ] nix
2020-05-16 14:46:56 +02:00
- [ ] markdown
2020-06-01 00:22:59 +02:00
- [x] regex (maintained by @theHamsta )
2020-07-16 12:59:35 +02:00
- [ ] jsdoc
2020-07-23 12:32:19 +01:00
- [x] dart (maintained by @Akin909 )
2020-07-26 09:38:53 -05:00
- [x] rst (maintained by @stsewd )
2020-04-28 11:56:00 +02:00
2020-06-12 14:11:37 -05:00
## User Query Extensions
You can add your own query files by placing a query file in vim's runtime path after `nvim-treesitter` is sourced.
If the language has a built in query file, that file will be appended to or it will be used (useful for languages not yet supported).
For example, you can add files to `<vim-config-dir>/after/queries/lua/highlights.scm` to add more queries to lua highlights.
You can also manually add query paths to the runtime path by adding this to your vim config `set rtp+='path/to/queries'` .
2020-04-28 11:56:00 +02:00
2020-04-22 17:17:21 +02:00
## Troubleshooting
2020-04-22 19:36:10 +02:00
Before doing anything run `:checkhealth nvim_treesitter` . This will help you find where the bug might come from.
2020-04-22 17:17:21 +02:00
### Feature `X` does not work for language `Y`...
2020-04-22 19:36:10 +02:00
First, check the `## Y parser healthcheck` section of `:checkhealth` if you have any warning.
If you do, it's highly possible that this is the cause of the problem.
2020-04-22 17:17:21 +02:00
If everything is okay, then it might be an actual error.
In both cases, feel free to open an issue here.
2020-07-15 09:24:57 +02:00
2020-07-21 18:15:20 +02:00
### I experience weird highlighting issues similar to [#78](https://github.com/nvim-treesitter/nvim-treesitter/issues/78)
2020-07-15 09:24:57 +02:00
2020-07-21 18:15:20 +02:00
This is a well known issue, which arise when the tree and the buffer are getting out of sync. \
As this issue comes from upstream, we don't have any finite fix. To get around this, you can force reparsing the buffer with this command:
2020-07-15 09:24:57 +02:00
```vim
:write | edit | TSBufEnable highlight
```
This will save, restore and enable highlighting for the current buffer, fixing the issue.