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-04-18 17:32:14 +02:00
|
|
|
# nvim-treesitter
|
2020-04-22 17:17:21 +02:00
|
|
|
Treesitter configurations and abstraction layer for Neovim.
|
|
|
|
|
|
|
|
|
|
# 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-04-22 19:36:10 +02:00
|
|
|
Treesitter is using a different _parser_ for every language. It can be quite a pain to install, but fortunately `nvim-treesitter`
|
|
|
|
|
provides two command to tackle this issue:
|
2020-04-22 17:17:21 +02:00
|
|
|
- `TSInstall` to install a given parser.
|
|
|
|
|
- `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-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-01 19:15:28 -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
|
|
|
},
|
|
|
|
|
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-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
|
|
|
|
|
|
|
|
|
|
For treesitter to work, we need to use query files such as those you can find in `queries/{lang}/{locals,highlights}.scm`
|
|
|
|
|
|
|
|
|
|
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-05-31 23:32:08 +02:00
|
|
|
- [x] go (maintained by @theHamsta)
|
2020-05-23 21:02:43 +02:00
|
|
|
- [x] cpp (maintained by @theHamsta, extends C queries)
|
2020-04-28 11:56:00 +02:00
|
|
|
- [ ] rust
|
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-04-28 11:56:00 +02:00
|
|
|
- [ ] csharp
|
|
|
|
|
- [ ] 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
|
|
|
|
|
- [ ] bash
|
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-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.
|