2020-09-10 13:57:42 -05:00
< div align = "center" >
< h1 > nvim-treesitter< / h1 >
< p >
< a href = "https://nvim-treesitter.zulipchat.com/" >
< img alt = "Zulip Chat" src = "https://img.shields.io/badge/zulip-join_chat-brightgreen.svg" / >
< / a >
< a href = "https://github.com/nvim-treesitter/nvim-treesitter/actions?query=workflow%3A%22Linting+and+style+checking%22+branch%3Amaster" >
< img alt = "Linting and Style" src = "https://github.com/nvim-treesitter/nvim-treesitter/workflows/Linting%20and%20style%20checking/badge.svg" / >
< / a >
< a href = "https://github.com/nvim-treesitter/nvim-treesitter/actions?query=workflow%3A%22Check+loading+of+syntax+files%22+branch%3Amaster" >
< img alt = "Syntax files" src = "https://github.com/nvim-treesitter/nvim-treesitter/workflows/Check%20loading%20of%20syntax%20files/badge.svg" / >
< / a >
< / p >
< / div >
2020-08-10 18:33:34 +02:00
2020-09-10 13:57:42 -05:00
< div align = "center" >
< p >
< img src = "assets/logo.png" align = "center" alt = "Logo" / >
< / p >
< p >
< a href = "https://github.com/tree-sitter/tree-sitter" > Treesitter< / a >
configurations and abstraction layer for
< a href = "https://github.com/neovim/neovim/" > Neovim< / a > .
< / p >
< p >
< i >
Logo by < a href = "https://github.com/steelsojka" > @steelsojka </ a >
< / i >
< / p >
< / div >
2020-07-27 09:23:42 -05:00
2020-11-21 22:46:24 +01:00
The goal of `nvim-treesitter` is both to provide a simple and easy way to use the interface for [tree-sitter ](https://github.com/tree-sitter/tree-sitter ) in Neovim and to provide some basic functionality such as highlighting based on it:
2020-11-21 22:07:17 +01:00
2020-09-10 13:57:42 -05:00

2020-07-27 20:59:51 -05:00
Traditional highlighting (left) vs Treesitter-based highlighting (right).
2020-11-21 22:07:17 +01:00
More examples can be found in [our gallery ](https://github.com/nvim-treesitter/nvim-treesitter/wiki/Gallery ).
**Warning: Treesitter and nvim-treesitter highlighting are an experimental feature of nightly versions of Neovim.
2021-06-11 13:56:09 +02:00
Please consider the experience with this plug-in as experimental until Neovim 0.6 is released!
2020-11-21 22:07:17 +01:00
You can find the current roadmap [here ](https://github.com/nvim-treesitter/nvim-treesitter/projects/1 ).
The roadmap and all features of this plugin are open to change, and any suggestion will be highly appreciated!**
2020-07-27 20:59:51 -05:00
2021-07-18 19:10:23 +02:00
*If you want to use this plugin with Neovim 0.5, please use the
0.5-compat branch. Be aware though that most improvements will require
neovim nightly.*
2020-11-21 22:46:24 +01:00
Nvim-treesitter is based on three interlocking features: [**language parsers** ](#language-parsers ), [**queries** ](#adding-queries ), and [**modules** ](#available-modules ), where *modules* provide features – e.g., highlighting – based on *queries* for syntax objects extracted from a given buffer by *language parsers* .
Users will generally only need to interact with parsers and modules as explained in the next section.
For more detailed information on setting these up, see ["Advanced setup" ](#advanced-setup ).
---
### Table of contents
* [Quickstart ](#quickstart )
* [Supported languages ](#supported-languages )
* [Available modules ](#available-modules )
* [Advanced setup ](#advanced-setup )
* [Extra features ](#extra-features )
* [Troubleshooting ](#troubleshooting )
---
2020-06-21 17:39:58 +02:00
2020-04-22 17:17:21 +02:00
# Quickstart
## Requirements
2020-07-27 09:23:42 -05:00
- Neovim [nightly ](https://github.com/neovim/neovim#install-from-source )
2021-06-13 00:44:36 +05:30
- `tar` and `curl` in your path (or alternatively `git` )
2020-10-15 22:36:59 +02:00
- A C compiler in your path and libstdc++ installed ([Windows users please read this! ](https://github.com/nvim-treesitter/nvim-treesitter/wiki/Windows-support )).
2020-04-22 17:17:21 +02:00
## Installation
2020-11-21 22:07:17 +01:00
You can install `nvim-treesitter` with your favorite package manager (or using the native `package` feature of vim, see `:h packages` ).
2020-04-22 17:17:21 +02:00
2020-11-21 22:07:17 +01:00
E.g., if you are using [vim-plug ](https://github.com/junegunn/vim-plug ), put this in your `init.vim` file:
2020-07-27 09:23:42 -05:00
2020-04-22 17:17:21 +02:00
```vim
2020-11-29 13:38:36 -04:00
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} " We recommend updating the parsers on update
2020-04-22 17:17:21 +02:00
```
2021-06-30 17:04:24 +05:30
For other plugin managers such as `packer.nvim` , see this [Installation page from the wiki ](https://github.com/nvim-treesitter/nvim-treesitter/wiki/Installation ) (Note that this page is community maintained).
2020-11-21 22:07:17 +01:00
## Language parsers
2020-04-22 17:17:21 +02:00
2020-11-21 22:46:24 +01:00
Treesitter uses a different _parser_ for every language, which needs to be generated via `tree-sitter-cli` from a `grammar.js` file, then compiled to a `.so` library that needs to be placed in neovim's `runtimepath` (typically under `parser/{language}.so` ).
To simplify this, `nvim-treesitter` provides commands to automate this process.
If the language is already [supported by `nvim-treesitter` ](#supported-languages ), you can install it with
2020-11-21 20:32:24 +01:00
```vim
2021-07-19 20:20:00 +01:00
:TSInstall < language_to_install >
2020-11-21 20:32:24 +01:00
```
2020-11-21 22:46:24 +01:00
This command supports tab expansion.
You can also get a list of all available languages and their installation status with `:TSInstallInfo` .
Parsers not on this list can be added manually by following the steps described under ["Adding parsers" ](#adding-parsers ) below.
2020-04-22 17:17:21 +02:00
2020-11-21 22:46:24 +01:00
If you update `nvim-treesitter` and want to make sure the parser is at the latest compatible version (as specified in `nvim-treesitter` 's `lockfile.json` ), use `:TSUpdate {language}` .
To update all parsers unconditionally, use `:TSUpdate all` or just `:TSUpdate` .
2020-07-27 09:23:42 -05:00
2020-11-21 22:07:17 +01:00
## Modules
2020-11-21 22:46:24 +01:00
Each module provides a distinct tree-sitter-based feature such as [highlighting ](#highlight ), [indentation ](#indentation ), or [folding ](#folding ); see [`:h nvim-treesitter-modules` ](doc/nvim-treesitter.txt ) or ["Available modules" ](#available-modules ) below for a list of modules and their options.
2020-04-28 11:56:00 +02:00
2020-11-21 22:46:24 +01:00
All modules are disabled by default and need to be activated explicitly in your `init.vim` , e.g., via
2020-04-28 11:56:00 +02:00
2020-11-12 19:34:35 -03:00
```vim
2020-11-11 16:52:35 -03:00
lua < < EOF
2020-04-28 11:56:00 +02:00
require'nvim-treesitter.configs'.setup {
2020-09-27 12:13:11 +02:00
ensure_installed = "maintained", -- one of "all", "maintained" (parsers with maintainers), or a list of languages
2021-03-24 09:12:03 -05:00
ignore_install = { "javascript" }, -- List of parsers to ignore installing
2020-08-09 11:39:51 -05:00
highlight = {
enable = true, -- false will disable the whole extension
disable = { "c", "rust" }, -- list of language that will be disabled
2021-07-14 01:08:57 +02:00
-- 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,
2020-08-09 11:39:51 -05:00
},
}
2020-11-11 16:52:35 -03:00
EOF
2020-08-09 11:39:51 -05:00
```
2020-11-21 22:07:17 +01:00
Each module can also be enabled or disabled interactively through the following commands:
```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-11-21 22:46:24 +01:00
Check [`:h nvim-treesitter-commands` ](doc/nvim-treesitter.txt ) for a list of all available commands.
It may be necessary to reload the buffer (e.g., via `:e` ) after enabling a module interactively.
2020-11-21 22:07:17 +01:00
2020-11-21 22:46:24 +01:00
# Supported languages
2020-11-21 22:07:17 +01:00
2020-11-21 22:46:24 +01:00
For `nvim-treesitter` to support a specific feature for a specific language requires both a parser for that language and an appropriate language-specific query file for that feature.
2020-11-21 22:07:17 +01:00
The following is a list of languages for which a parser can be installed through `:TSInstall` ; a checked box means that `nvim-treesitter` also contains queries at least for the `highlight` module.
We are looking for maintainers to add more parsers and to write query files for their languages.
<!-- This section of the README is automatically updated by a CI job -->
<!-- parserinfo -->
- [x] [bash ](https://github.com/tree-sitter/tree-sitter-bash ) (maintained by @TravonteD )
2021-03-22 10:36:09 +00:00
- [x] [beancount ](https://github.com/polarmutex/tree-sitter-beancount ) (maintained by @polarmutex )
2021-03-30 14:45:29 +00:00
- [x] [bibtex ](https://github.com/latex-lsp/tree-sitter-bibtex ) (maintained by @theHamsta by asking @clason )
2020-11-21 22:07:17 +01:00
- [x] [c ](https://github.com/tree-sitter/tree-sitter-c ) (maintained by @vigoux )
2021-06-06 19:15:41 +00:00
- [x] [c_sharp ](https://github.com/tree-sitter/tree-sitter-c-sharp ) (maintained by @Luxed )
2020-11-21 22:07:17 +01:00
- [x] [clojure ](https://github.com/sogaiu/tree-sitter-clojure ) (maintained by @sogaiu )
2021-07-04 18:19:14 +00:00
- [x] [cmake ](https://github.com/uyha/tree-sitter-cmake ) (maintained by @uyha )
2021-03-12 11:21:46 -05:00
- [x] [comment ](https://github.com/stsewd/tree-sitter-comment ) (maintained by @stsewd )
2021-04-05 14:37:53 +02:00
- [x] [commonlisp ](https://github.com/theHamsta/tree-sitter-commonlisp ) (maintained by @theHamsta )
2020-11-21 22:07:17 +01:00
- [x] [cpp ](https://github.com/tree-sitter/tree-sitter-cpp ) (maintained by @theHamsta )
- [x] [css ](https://github.com/tree-sitter/tree-sitter-css ) (maintained by @TravonteD )
2021-06-12 14:43:52 +00:00
- [x] [cuda ](https://github.com/theHamsta/tree-sitter-cuda ) (maintained by @theHamsta )
2020-11-21 22:07:17 +01:00
- [x] [dart ](https://github.com/UserNobody14/tree-sitter-dart ) (maintained by @Akin909 )
2021-02-10 22:18:38 +01:00
- [x] [devicetree ](https://github.com/joelspadin/tree-sitter-devicetree ) (maintained by @jedrzejboczar )
2021-05-11 10:03:36 -06:00
- [x] [dockerfile ](https://github.com/camdencheek/tree-sitter-dockerfile ) (maintained by @camdencheek )
2021-05-19 03:46:37 +00:00
- [x] [elixir ](https://github.com/ananthakumaran/tree-sitter-elixir ) (maintained by @nifoc )
2021-02-01 10:35:23 +00:00
- [ ] [elm ](https://github.com/elm-tooling/tree-sitter-elm )
2020-12-10 16:32:20 +00:00
- [x] [erlang ](https://github.com/AbstractMachinesLab/tree-sitter-erlang ) (maintained by @ostera )
2020-11-21 22:07:17 +01:00
- [x] [fennel ](https://github.com/travonted/tree-sitter-fennel ) (maintained by @TravonteD )
2021-07-19 18:52:01 +02:00
- [x] [fish ](https://github.com/ram02z/tree-sitter-fish ) (maintained by @ram02z )
2021-04-17 20:42:17 +02:00
- [ ] [fortran ](https://github.com/stadelmanma/tree-sitter-fortran )
2021-04-23 09:59:11 +00:00
- [x] [Godot (gdscript) ](https://github.com/PrestonKnopp/tree-sitter-gdscript ) (maintained by @Shatur95 )
2021-03-01 18:11:42 +00:00
- [x] [Glimmer and Ember ](https://github.com/alexlafroscia/tree-sitter-glimmer ) (maintained by @alexlafroscia )
2020-11-21 22:07:17 +01:00
- [x] [go ](https://github.com/tree-sitter/tree-sitter-go ) (maintained by @theHamsta , @WinWisely268 )
2021-07-29 09:27:45 +00:00
- [x] [Godot Resources (gdresource) ](https://github.com/PrestonKnopp/tree-sitter-godot-resource ) (maintained by @pierpo )
2021-04-27 21:25:30 +00:00
- [x] [gomod ](https://github.com/camdencheek/tree-sitter-go-mod ) (maintained by @camdencheek )
2020-11-29 12:36:08 +00:00
- [x] [graphql ](https://github.com/bkegley/tree-sitter-graphql ) (maintained by @bkegley )
2020-11-21 22:07:17 +01:00
- [ ] [haskell ](https://github.com/tree-sitter/tree-sitter-haskell )
2021-06-28 19:11:33 +02:00
- [x] [hcl ](https://github.com/MichaHoffmann/tree-sitter-hcl ) (maintained by @MichaHoffmann )
2020-11-21 22:07:17 +01:00
- [x] [html ](https://github.com/tree-sitter/tree-sitter-html ) (maintained by @TravonteD )
- [x] [java ](https://github.com/tree-sitter/tree-sitter-java ) (maintained by @p00f )
- [x] [javascript ](https://github.com/tree-sitter/tree-sitter-javascript ) (maintained by @steelsojka )
- [x] [jsdoc ](https://github.com/tree-sitter/tree-sitter-jsdoc ) (maintained by @steelsojka )
- [x] [json ](https://github.com/tree-sitter/tree-sitter-json ) (maintained by @steelsojka )
2021-03-02 16:45:51 +00:00
- [x] [JSON with comments ](https://gitlab.com/WhyNotHugo/tree-sitter-jsonc.git ) (maintained by @WhyNotHugo )
2020-12-31 13:51:11 +00:00
- [x] [julia ](https://github.com/tree-sitter/tree-sitter-julia ) (maintained by @mroavi , @theHamsta )
2021-03-10 23:59:59 +00:00
- [x] [kotlin ](https://github.com/tormodatt/tree-sitter-kotlin ) (maintained by @tormodatt )
2021-03-30 14:45:29 +00:00
- [x] [latex ](https://github.com/latex-lsp/tree-sitter-latex ) (maintained by @theHamsta by asking @clason )
2021-01-28 22:42:07 +01:00
- [x] [ledger ](https://github.com/cbarrete/tree-sitter-ledger ) (maintained by @cbarrete )
2020-11-21 22:07:17 +01:00
- [x] [lua ](https://github.com/nvim-treesitter/tree-sitter-lua ) (maintained by @vigoux )
- [x] [nix ](https://github.com/cstrahan/tree-sitter-nix ) (maintained by @leo60228 )
- [x] [ocaml ](https://github.com/tree-sitter/tree-sitter-ocaml ) (maintained by @undu )
- [x] [ocaml_interface ](https://github.com/tree-sitter/tree-sitter-ocaml ) (maintained by @undu )
- [x] [ocamllex ](https://github.com/atom-ocaml/tree-sitter-ocamllex ) (maintained by @undu )
- [x] [php ](https://github.com/tree-sitter/tree-sitter-php ) (maintained by @tk -shirasaka)
- [x] [python ](https://github.com/tree-sitter/tree-sitter-python ) (maintained by @stsewd , @theHamsta )
- [x] [ql ](https://github.com/tree-sitter/tree-sitter-ql ) (maintained by @pwntester )
- [x] [Tree-sitter query language ](https://github.com/nvim-treesitter/tree-sitter-query ) (maintained by @steelsojka )
2021-03-09 19:07:04 +00:00
- [x] [r ](https://github.com/r-lib/tree-sitter-r ) (maintained by @jimhester )
2020-11-21 22:07:17 +01:00
- [x] [regex ](https://github.com/tree-sitter/tree-sitter-regex ) (maintained by @theHamsta )
- [x] [rst ](https://github.com/stsewd/tree-sitter-rst ) (maintained by @stsewd )
- [x] [ruby ](https://github.com/tree-sitter/tree-sitter-ruby ) (maintained by @TravonteD )
- [x] [rust ](https://github.com/tree-sitter/tree-sitter-rust ) (maintained by @vigoux )
- [ ] [scala ](https://github.com/tree-sitter/tree-sitter-scala )
2021-05-26 03:42:46 +00:00
- [x] [scss ](https://github.com/serenadeai/tree-sitter-scss ) (maintained by @elianiva )
2020-12-28 12:54:18 +01:00
- [x] [sparql ](https://github.com/BonaBeavis/tree-sitter-sparql ) (maintained by @bonabeavis )
2021-02-11 03:57:51 +00:00
- [x] [supercollider ](https://github.com/madskjeldgaard/tree-sitter-supercollider ) (maintained by @madskjeldgaard )
2021-08-03 14:11:09 +00:00
- [x] [surface ](https://github.com/connorlay/tree-sitter-surface ) (maintained by @connorlay )
2021-02-06 10:37:52 +00:00
- [x] [svelte ](https://github.com/Himujjal/tree-sitter-svelte ) (maintained by @elianiva )
2020-11-21 22:07:17 +01:00
- [ ] [swift ](https://github.com/tree-sitter/tree-sitter-swift )
- [x] [teal ](https://github.com/euclidianAce/tree-sitter-teal ) (maintained by @euclidianAce )
- [x] [toml ](https://github.com/ikatyang/tree-sitter-toml ) (maintained by @tk -shirasaka)
2021-03-24 17:29:02 +00:00
- [x] [tsx ](https://github.com/tree-sitter/tree-sitter-typescript ) (maintained by @steelsojka )
2021-01-05 12:37:16 +01:00
- [x] [turtle ](https://github.com/BonaBeavis/tree-sitter-turtle ) (maintained by @bonabeavis )
2020-11-21 22:07:17 +01:00
- [x] [typescript ](https://github.com/tree-sitter/tree-sitter-typescript ) (maintained by @steelsojka )
2021-03-10 11:09:48 +00:00
- [x] [verilog ](https://github.com/tree-sitter/tree-sitter-verilog ) (maintained by @zegervdv )
2021-02-17 22:04:35 +00:00
- [x] [vue ](https://github.com/ikatyang/tree-sitter-vue ) (maintained by @WhyNotHugo )
2021-04-18 16:51:03 -05:00
- [x] [yaml ](https://github.com/ikatyang/tree-sitter-yaml ) (maintained by @stsewd )
2021-07-19 07:44:03 +02:00
- [x] [yang ](https://github.com/Hubro/tree-sitter-yang ) (maintained by @Hubro )
2021-03-23 20:05:45 +00:00
- [x] [zig ](https://github.com/Himujjal/tree-sitter-zig ) (maintained by @Himujjal )
2020-11-21 22:07:17 +01:00
<!-- parserinfo -->
2020-11-21 22:46:24 +01:00
# Available modules
2020-11-21 22:07:17 +01:00
2020-11-21 22:46:24 +01:00
Modules provide the top-level features of `nvim-treesitter` .
The following is a list of modules included in `nvim-treesitter` and their configuration via `init.vim` (where multiple modules can be combined in a single call to `setup` ).
Note that not all modules work for all languages (depending on the queries available for them).
Additional modules can be provided as [external plugins ](https://github.com/nvim-treesitter/nvim-treesitter/wiki/Extra-modules-and-plugins ).
2020-11-21 22:07:17 +01:00
2020-11-21 22:46:24 +01:00
#### Highlight
2020-08-09 11:39:51 -05:00
Consistent syntax highlighting.
2020-11-12 19:34:35 -03:00
```vim
lua < < EOF
2020-08-09 11:39:51 -05:00
require'nvim-treesitter.configs'.setup {
highlight = {
enable = true,
custom_captures = {
-- Highlight the @foo .bar capture group with the "Identifier" highlight group.
["foo.bar"] = "Identifier",
2020-04-28 11:56:00 +02:00
},
2021-07-14 01:08:57 +02:00
-- 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,
2020-08-09 11:39:51 -05:00
},
}
2020-11-12 19:34:35 -03:00
EOF
2020-08-09 11:39:51 -05:00
```
2020-11-21 22:07:17 +01:00
#### Incremental selection
2020-08-09 11:39:51 -05:00
Incremental selection based on the named nodes from the grammar.
2020-11-12 19:34:35 -03:00
```vim
lua < < EOF
2020-08-09 11:39:51 -05:00
require'nvim-treesitter.configs'.setup {
incremental_selection = {
enable = true,
keymaps = {
init_selection = "gnn",
node_incremental = "grn",
scope_incremental = "grc",
node_decremental = "grm",
2020-05-01 12:26:57 +02:00
},
2020-08-09 11:39:51 -05:00
},
}
2020-11-12 19:34:35 -03:00
EOF
2020-08-09 11:39:51 -05:00
```
2020-11-21 22:46:24 +01:00
#### Indentation
2020-10-19 21:32:54 +02:00
2021-07-05 12:11:55 -05:00
Indentation based on treesitter for the `=` operator.
**NOTE: This is an experimental feature**.
2020-10-19 21:32:54 +02:00
2020-11-12 19:34:35 -03:00
```vim
lua < < EOF
2021-01-29 10:49:36 +07:00
require'nvim-treesitter.configs'.setup {
2020-10-19 21:32:54 +02:00
indent = {
enable = true
}
}
2020-11-12 19:34:35 -03:00
EOF
2020-10-19 21:32:54 +02:00
```
2020-11-21 22:46:24 +01:00
#### Folding
2021-04-05 16:21:03 +02:00
Tree-sitter based folding. *(Technically not a module because it's per windows and not per buffer.)*
2020-08-09 11:39:51 -05:00
```vim
set foldmethod=expr
set foldexpr=nvim_treesitter#foldexpr ()
```
2021-07-08 23:08:06 +06:00
This will respect your `foldminlines` and `foldnestmax` settings.
2020-09-07 11:41:37 -05:00
2020-11-21 22:46:24 +01:00
# Advanced setup
2020-08-09 11:39:51 -05:00
2020-11-21 22:46:24 +01:00
## Adding parsers
2020-11-21 21:00:38 +01:00
2020-11-21 22:46:24 +01:00
If you have a parser that is not on the list of supported languages (either as a repository on Github or in a local directory), you can add it manually for use by `nvim-treesitter` as follows:
2020-11-21 21:00:38 +01:00
2020-11-21 22:46:24 +01:00
1. Clone the repository or [create a new project ](https://tree-sitter.github.io/tree-sitter/creating-parsers#project-setup ) in, say, `~/projects/tree-sitter-zimbu` . Make sure that the `tree-sitter-cli` executable is installed and in your path; see < https: // tree-sitter . github . io / tree-sitter / creating-parsers #installation > for installation instructions.
2020-11-21 21:00:38 +01:00
2. Run `tree-sitter generate` in this directory (followed by `tree-sitter test` for good measure).
3. Add the following snippet to your `init.vim` :
```vim
lua < < EOF
local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
parser_config.zimbu = {
install_info = {
url = "~/projects/tree-sitter-zimbu", -- local path or git repo
files = {"src/parser.c"}
},
filetype = "zu", -- if filetype does not agrees with parser name
used_by = {"bar", "baz"} -- additional filetypes that use this parser
}
EOF
```
4. Start `nvim` and `:TSInstall zimbu` .
2020-11-21 22:46:24 +01:00
You can also skip step 2 and use `:TSInstallFromGrammar zimbu` to install directly from a `grammar.js` in the top-level directory specified by `url` .
Once the parser is installed, you can update it (from the latest revision of the `main` branch if `url` is a Github repository) with `:TSUpdate zimbu` .
2020-11-21 21:00:38 +01:00
2021-07-08 20:31:00 -04:00
Note that neither `:TSInstall` nor `:TSInstallFromGrammar` copy query files from the grammar repository.
If you want your installed grammar to be useful, you must manually [add query files ](#adding-queries ) to your local nvim-treesitter installation.
Note also that module functionality is only triggered if your language's filetype is correctly identified.
If Neovim does not detect your language's filetype by default, you can add a short Vimscript file to nvim-treesitter's `ftdetect` runtime directory.
See [Neovim's documentation ](https://neovim.io/doc/user/filetype.html#new-filetype ) on how to use Vimscript to detect a filetype.
2020-11-30 21:30:07 -04:00
## Update parsers used_by
Sometimes needs to use some parser for different filetype.
Add the following snippet to your `init.vim` :
```vim
lua < < EOF
local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
parser_config.typescript.used_by = "javascriptflow"
EOF
```
2020-11-21 22:46:24 +01:00
## Adding queries
2020-11-21 22:07:17 +01:00
Queries are what `nvim-treesitter` uses to extract informations from the syntax tree; they are
2020-11-21 22:46:24 +01:00
located in the `queries/{language}/*` runtime directories (like the `queries` folder of this plugin), e.g., `queries/{language}/{locals,highlights,textobjects}.scm` .
Other modules may require additional queries such as `folding.scm` .
2020-11-21 22:07:17 +01:00
2020-11-21 22:46:24 +01:00
`nvim-treesitter` considers queries as any runtime file (see `:h rtp` ), i.e.,
2020-11-21 21:00:38 +01:00
2020-11-21 22:07:17 +01:00
- if the file is in any `after/queries/` folder, then it will be used to extend the already defined
queries.
- Otherwise, it will be used as a base to define the query, the first query found (with the highest
priority) will be the only one to be used.
2020-06-29 09:58:51 -05:00
2020-11-21 22:07:17 +01:00
This hybrid approach is the most standard way; in this case
2020-08-09 11:39:51 -05:00
2020-11-21 22:07:17 +01:00
- if you want to rewrite (or write) a query, don't use `after/queries` ;
- if you want to override a part of a query (only one match for example), use the `after/queries`
directory.
2020-06-29 09:58:51 -05:00
2020-11-21 22:07:17 +01:00
## Adding modules
2020-07-02 10:26:53 -05:00
2020-11-21 22:07:17 +01:00
If you wish you write your own module, you need to support
2020-07-02 10:26:53 -05:00
2020-11-21 22:07:17 +01:00
- tree-sitter language detection support;
- attaching and detaching to buffers;
- all nvim-treesitter commands.
2020-07-02 10:26:53 -05:00
2020-11-21 22:07:17 +01:00
At the top level, you can use the `define_modules` function to define one or more modules or module groups:
2020-07-02 10:26:53 -05:00
2020-11-12 19:34:35 -03:00
```vim
lua < < EOF
2020-08-09 11:39:51 -05:00
require'nvim-treesitter'.define_modules {
2020-07-02 10:26:53 -05:00
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
}
}
2020-11-12 19:34:35 -03:00
EOF
2020-07-02 10:26:53 -05:00
```
2020-11-21 22:46:24 +01:00
with the following properties:
2020-07-02 10:26:53 -05:00
2020-11-21 22:46:24 +01:00
- `module_path` specifies 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` takes a list of languages that this module is disabled for. This is usually overridden by the user.
- `is_supported` takes a function that takes a language and determines if this module supports that language.
- `attach` takes a function that attaches to a buffer. This is required if `module_path` is not provided.
- `detach` takes a function that detaches from a buffer. This is required if `module_path` is not provided.
2020-07-02 10:26:53 -05:00
2020-11-21 22:07:17 +01:00
# Extra features
### Statusline indicator
```vim
echo nvim_treesitter#statusline (90) " 90 can be any length
module->expression_statement->call->identifier
```
### Utilities
2020-05-15 14:19:29 +02:00
2020-07-27 20:59:51 -05:00
You can get some utility functions with
2020-07-27 09:23:42 -05:00
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-04-28 11:56:00 +02:00
2020-08-09 11:39:51 -05:00
Check [`:h nvim-treesitter-utils` ](doc/nvim-treesitter.txt ) for more information.
2020-04-28 11:56:00 +02:00
2020-08-09 11:39:51 -05:00
# Troubleshooting
2020-07-27 09:23:42 -05:00
2020-11-21 22:46:24 +01:00
Before doing anything, make sure you have the latest version of this plugin and run `:checkhealth nvim_treesitter` .
It can also help to update the parsers via `:TSUpdate` .
2020-04-22 17:17:21 +02:00
2020-11-21 22:46:24 +01:00
#### Feature `X` does not work for `{language}`...
2020-07-27 09:23:42 -05:00
2021-07-08 20:31:00 -04:00
First, check the `health#nvim_treesitter#check` and the `health#treesitter#check` sections of `:checkhealth` for any warning.
2020-11-21 22:46:24 +01:00
If there is one, it's highly likely that this is the cause of the problem.
2020-04-22 17:17:21 +02:00
2021-07-08 20:31:00 -04:00
Next check the `## Parser/Features` subsection of the `health#nvim_treesitter#check` section of `:checkhealth` to ensure the desired module is enabled for your language.
If not, you might be missing query files; see [Adding queries ](#adding-queries ).
Finally, ensure Neovim is correctly identifying your language's filetype using the `:echo &filetype` command while one of your language's files is open in Neovim.
If not, add a short Vimscript file to nvim-treesitter's `ftdetect` runtime directory following [Neovim's documentation ](https://neovim.io/doc/user/filetype.html#new-filetype ) on filetype detection.
You can also quickly & temporarily set the filetype for a single buffer with the `:set filetype=langname` command to test whether it fixes the problem.
If everything is okay, then it might be an actual error.
2020-11-21 22:46:24 +01:00
In that case, feel free to [open an issue here ](https://github.com/nvim-treesitter/nvim-treesitter/issues/new/choose ).
2020-07-15 09:24:57 +02:00
2020-11-21 22:46:24 +01:00
#### I get `module 'vim.treesitter.query' not found`
2020-09-18 17:47:20 -05:00
Make sure you have the latest nightly version of Neovim.
2020-11-21 22:46:24 +01:00
#### I get `Error detected while processing .../plugin/nvim-treesitter.vim` every time I open Neovim
2020-08-01 15:33:44 -05:00
This is probably due to a change in a parser's grammar or its queries.
Try updating the parser that you suspect has changed (`:TSUpdate {language}` ) or all of them (`:TSUpdate` ).
If the error persists after updating all parsers,
please [open an issue ](https://github.com/nvim-treesitter/nvim-treesitter/issues/new/choose ).
2020-11-21 22:46:24 +01: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-11-21 22:46:24 +01:00
This is a well known issue, which arises when the tree and the buffer have gotten out of sync.
As this is an upstream issue, we don't have any definite fix.
To get around this, you can force reparsing the buffer with
2020-07-27 09:23:42 -05:00
2020-07-15 09:24:57 +02:00
```vim
:write | edit | TSBufEnable highlight
```
2020-07-27 09:23:42 -05:00
2020-11-21 22:46:24 +01:00
This will save, restore and enable highlighting for the current buffer.
2020-08-27 14:59:01 +02:00
2020-11-21 22:46:24 +01:00
#### I experience bugs when using `nvim-treesitter`'s `foldexpr` similar to [#194](https://github.com/nvim-treesitter/nvim-treesitter/issues/194)
2020-08-27 14:59:01 +02:00
2020-11-21 22:46:24 +01:00
This might happen, and is known to happen, with `vim-clap` .
To avoid these kind of errors, please use `setlocal` instead of `set` for the respective filetypes.
2021-01-04 08:35:43 +01:00
#### I run into errors like `module 'nvim-treesitter.configs' not found` at startup
This is because of `rtp` management in `nvim` , adding `packadd
nvim-treesitter` should fix the issue.