nvim-treesitter

Zulip Chat Linting and Style Syntax files

Logo

Treesitter configurations and abstraction layer for Neovim.

Logo by @steelsojka

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 on it: ![cpp example](assets/example-cpp.png) Traditional highlighting (left) vs Treesitter-based highlighting (right). 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. Please consider the experience with this plug-in as experimental until Neovim 0.5 is released! 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!** Nvim-treesitter is based on three interlocking features: [**language parsers**](#parsers), [**queries**](#queries), and [**modules**](#modules), where *modules* provide features -- such as highlighting -- based on *queries* for syntax objects specified 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). # Quickstart ## Requirements - Neovim [nightly](https://github.com/neovim/neovim#install-from-source) - `tar` and `curl` in your path (or alternativly `git`) - A C compiler in your path and libstdc++ installed ([Windows users please read this!](https://github.com/nvim-treesitter/nvim-treesitter/wiki/Windows-support)). ## Installation You can install `nvim-treesitter` with your favorite package manager (or using the native `package` feature of vim, see `:h packages`). E.g., if you are using [vim-plug](https://github.com/junegunn/vim-plug), put this in your `init.vim` file: ```vim Plug 'nvim-treesitter/nvim-treesitter' ``` ## Language parsers 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/{lang}.so`). To simplify this, `nvim-treesitter` provides commands to automate this process. If the language is already [supported by `nvim-treesitter`](#supported), you can install it with ```vim :TSInstall {language} ``` 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 unsupported parsers"](#unsupported) below. 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`. ## Modules Each modules provide a distinct feature based on treesitter such as [highlighting](#highlighting), [indentation](#indentation), or [folding](#folding); see [`:h nvim-treesitter-modules`](doc/nvim-treesitter.txt) or see ["Modules"](#modules) below for a list of available modules and their options. All modules are disabled by default and need to be activated explicitly in your `init.vim`: ```vim lua <Supported languages For `nvim-treesitter` to support a specific feature for a specific language requires both a parser for this language and an appropriate query file for that language and that feature. 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. - [x] [bash](https://github.com/tree-sitter/tree-sitter-bash) (maintained by @TravonteD) - [x] [c](https://github.com/tree-sitter/tree-sitter-c) (maintained by @vigoux) - [x] [c_sharp](https://github.com/tree-sitter/tree-sitter-c-sharp) (maintained by @svermeulen) - [x] [clojure](https://github.com/sogaiu/tree-sitter-clojure) (maintained by @sogaiu) - [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) - [x] [dart](https://github.com/UserNobody14/tree-sitter-dart) (maintained by @Akin909) - [ ] [elm](https://github.com/razzeee/tree-sitter-elm) - [x] [fennel](https://github.com/travonted/tree-sitter-fennel) (maintained by @TravonteD) - [x] [go](https://github.com/tree-sitter/tree-sitter-go) (maintained by @theHamsta, @WinWisely268) - [ ] [haskell](https://github.com/tree-sitter/tree-sitter-haskell) - [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) - [ ] [julia](https://github.com/tree-sitter/tree-sitter-julia) - [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) - [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) - [ ] [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) - [ ] [tsx](https://github.com/tree-sitter/tree-sitter-typescript) - [x] [typescript](https://github.com/tree-sitter/tree-sitter-typescript) (maintained by @steelsojka) - [x] [verilog](https://github.com/tree-sitter/tree-sitter-verilog) (maintained by @zegervdv) - [ ] [vue](https://github.com/ikatyang/tree-sitter-vue) - [ ] [yaml](https://github.com/ikatyang/tree-sitter-yaml) # Available modules Modules provide the top-level features of `nvim-treesitter`. These can be implemented either as part of `nvim-treesitter` or as an external plugin. ## Included modules The following is a list of modules included in `nvim-treesitter`. Note that not all modules work for all languages (depending on the queries available for them). #### Highlight Consistent syntax highlighting. ```vim lua < Indentation Treesitter based indentation (`=` vim behavior) ```vim lua < Folding ```vim set foldmethod=expr set foldexpr=nvim_treesitter#foldexpr() ``` This will respect your `foldnestmax` setting. ## External modules Other modules can be installed as plugins, such as - [refactor](https://github.com/nvim-treesitter/nvim-treesitter-refactor) - Refactoring and definition modules - [textobjects](https://github.com/nvim-treesitter/nvim-treesitter-textobjects) - Textobjects defined by tree-sitter queries - [playground](https://github.com/nvim-treesitter/playground) - Treesitter integrated playground - [context](https://github.com/romgrk/nvim-treesitter-context) - Show parent code context in a popover # Advanced setup ## Adding parsers If you have a parser that is not on this list (either from a repository on Github or a local directory), you can add it manually for use by `nvim-treesitter` as follows: 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. 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 < Adding queries Queries are what `nvim-treesitter` uses to extract informations from the syntax tree; they are 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`. `nvim-treesitter` considers queries as any runtime file (see `:h rtp`), that is : - 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. This hybrid approach is the most standard way; in this case - 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. ## Adding modules If you wish you write your own module, you need to support - tree-sitter language detection support; - attaching and detaching to buffers; - all nvim-treesitter commands. At the top level, you can use the `define_modules` function to define one or more modules or module groups: ```vim lua <expression_statement->call->identifier ``` ### Utilities You can get some utility functions with ```lua local ts_utils = require 'nvim-treesitter.ts_utils' ``` Check [`:h nvim-treesitter-utils`](doc/nvim-treesitter.txt) for more information. # Troubleshooting 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`. This will help you find where the bug might come from. * **Feature `X` does not work for `{language}`...** First, check the `## {language} 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. If everything is okay, then it might be an actual error. In both cases, feel free to [open an issue here](https://github.com/nvim-treesitter/nvim-treesitter/issues/new/choose). * **I get `module 'vim.treesitter.query' not found`** Make sure you have the latest nightly version of Neovim. * **I get `Error detected while processing .../plugin/nvim-treesitter.vim` every time I open Neovim** 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). * **I experience weird highlighting issues similar to [#78](https://github.com/nvim-treesitter/nvim-treesitter/issues/78)** 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: ```vim :write | edit | TSBufEnable highlight ``` This will save, restore and enable highlighting for the current buffer, fixing the issue. * **I experience bugs when using `nvim-treesitter`'s `foldexpr` similar to [#194](https://github.com/nvim-treesitter/nvim-treesitter/issues/194)** This might happen, and is known to happen with `vim-clap`, to avoid those kind of errors, please use `setlocal` instead of `set` for the appropriate filetypes.