mirror of
https://github.com/nvim-treesitter/nvim-treesitter.git
synced 2026-07-01 19:17:02 -04:00
This updates * README * CONTRIBUTING * the `:h nvim-treesitter` documentation to the current state of `main`. It also adds a pull request template for adding a new language.
200 lines
8.1 KiB
Markdown
200 lines
8.1 KiB
Markdown
<h1 align="center">
|
|
<img src="https://github.com/nvim-treesitter/nvim-treesitter/assets/2361214/0513b223-c902-4f12-92ee-8ac4d8d6f41f" alt="nvim-treesitter">
|
|
</h1>
|
|
<div align="center">
|
|
<p>
|
|
<a href="https://matrix.to/#/#nvim-treesitter:matrix.org">
|
|
<img alt="Matrix Chat" src="https://img.shields.io/matrix/nvim-treesitter:matrix.org" />
|
|
</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>
|
|
|
|
|
|
>[!WARNING]
|
|
> This branch is a [full, incompatible, rewrite of `nvim-treesitter`](https://github.com/nvim-treesitter/nvim-treesitter/issues/4767) and [work in progress](TODO.md). The **stable** branch is [`master`](https://github.com/nvim-treesitter/nvim-treesitter/tree/master).
|
|
|
|
The `nvim-treesitter` plugin provides
|
|
1. functions for installing, updating, and removing [**tree-sitter parsers**](SUPPORTED_LANGUAGES.md);
|
|
2. a collection of **queries** for enabling tree-sitter features built into Neovim for these languages.
|
|
|
|
For details on these and how to help improving them, see [CONTRIBUTING.md](./CONTRIBUTING.md).
|
|
|
|
# Quickstart
|
|
|
|
## Requirements
|
|
|
|
- Neovim 0.11.0 or later (nightly)
|
|
- `tar` and `curl` in your path
|
|
- [`tree-sitter`](https://github.com/tree-sitter/tree-sitter) CLI (0.25.0 or later)
|
|
- a C compiler in your path (see <https://docs.rs/cc/latest/cc/#compile-time-requirements>)
|
|
- `Node` (23.0.0 or later) for some parsers (see the [list of supported languages](SUPPORTED_LANGUAGES.md))
|
|
|
|
## Installation
|
|
|
|
You can install `nvim-treesitter` with your favorite package manager (or using the native `package` feature of vim, see `:h packages`).
|
|
|
|
This plugin is only guaranteed to work with specific versions of language parsers** (as specified in the `parser.lua` table). **When upgrading the plugin, you must make sure that all installed parsers are updated to the latest version** via `:TSUpdate`.
|
|
It is strongly recommended to automate this; e.g., using [lazy.nvim](https://github.com/folke/lazy.nvim)
|
|
|
|
```lua
|
|
require('lazy').setup(
|
|
{ 'nvim-treesitter/nvim-treesitter', build = ':TSUpdate', lazy = false }
|
|
)
|
|
```
|
|
|
|
>[!IMPORTANT]
|
|
> This plugin does not support lazy-loading.
|
|
|
|
## Setup
|
|
|
|
`nvim-treesitter` can be configured by calling `setup`. The following snippet lists the available options and their default values. **You do not need to call `setup` for `nvim-treesitter` to work using default values.**
|
|
|
|
```lua
|
|
require'nvim-treesitter'.setup {
|
|
-- Directory to install parsers and queries to
|
|
install_dir = vim.fn.stdpath('data') .. '/site'
|
|
-- List of parsers to ignore when installing tiers
|
|
ignore_install = { },
|
|
}
|
|
```
|
|
|
|
Parsers and queries can then be installed with
|
|
|
|
```lua
|
|
require'nvim-treesitter'.install { 'rust', 'javascript', 'zig' }
|
|
```
|
|
|
|
(This is a no-op if the parsers are already installed.) Note that this function runs asynchronously; for synchronous installation in a script context ("bootstrapping"), use something like
|
|
```lua
|
|
local done = nil
|
|
require('nvim-treesitter').install({ 'rust', 'javascript', 'zig' }, function(success)
|
|
done = success
|
|
end)
|
|
vim.wait(3000000, function() return done ~= nil end)
|
|
```
|
|
|
|
Check [`:h nvim-treesitter-commands`](doc/nvim-treesitter.txt) for a list of all available commands.
|
|
|
|
# Supported languages
|
|
|
|
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.
|
|
|
|
A list of the currently supported languages can be found [on this page](SUPPORTED_LANGUAGES.md). If you wish to add a new language or improve the queries for an existing one, please see our [contributing guide](CONTRIBUTING.md).
|
|
|
|
For related information on the supported languages, including related plugins, see [this wiki page](https://github.com/nvim-treesitter/nvim-treesitter/wiki/Supported-Languages-Information).
|
|
|
|
# Supported features
|
|
|
|
`nvim-treesitter` provides queries for the following features. **These are not automatically enabled.**
|
|
|
|
## Highlighting
|
|
|
|
Treesitter highlighting is provided by Neovim, see `:h treesitter-highlight`. To enable it for a filetype, put `vim.treesitter.start()` in a `ftplugin/<filetype>.lua` in your config directory, or place the following in your `init.lua`:
|
|
|
|
```lua
|
|
vim.api.nvim_create_autocmd('FileType', {
|
|
pattern = { '<filetype>' },
|
|
callback = function() vim.treesitter.start() end,
|
|
})
|
|
```
|
|
|
|
## Folds
|
|
|
|
Treesitter-based folding is provided by Neovim. To enable it, put the following in your `ftplugin` or `FileType` autocommand:
|
|
|
|
```lua
|
|
vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
|
|
```
|
|
|
|
## Indentation
|
|
|
|
Treesitter-based indentation is provided by this plugin but considered **experimental**. To enable it, put the following in your `ftplugin` or `FileType` autocommand:
|
|
|
|
```lua
|
|
vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
|
|
```
|
|
|
|
(Note the specific quotes used.)
|
|
|
|
## Injections
|
|
|
|
Injections are used for multi-language documents, see `:h treesitter-language-injections`. No setup is needed.
|
|
|
|
## Locals
|
|
|
|
These queries can be used to look up definitions and references to identifiers in a given scope. They are not used in this plugin and are provided for (limited) backward compatibility.
|
|
|
|
# Advanced setup
|
|
|
|
## Adding parsers
|
|
|
|
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:
|
|
|
|
1. Add the following snippet in a `User TSUpdate` autocommand:
|
|
|
|
```lua
|
|
vim.api.nvim_create_autocmd('User', { pattern = 'TSUpdate',
|
|
callback = function()
|
|
require('nvim-treesitter.parsers').zimbu = {
|
|
install_info = {
|
|
url = 'https://github.com/zimbulang/tree-sitter-zimbu',
|
|
revision = <sha>, -- commit hash for revision to check out; HEAD if missing
|
|
-- optional entries:
|
|
branch = 'develop', -- only needed if different from default branch
|
|
location = 'parser', -- only needed if the parser is in subdirectory of a "monorepo"
|
|
generate = true, -- only needed if repo does not contain pre-generated `src/parser.c`
|
|
generate_from_json = false, -- only needed if repo does not contain `src/grammar.json`
|
|
},
|
|
}
|
|
end})
|
|
```
|
|
|
|
Alternatively, if you have a local checkout, you can instead use
|
|
```lua
|
|
install_info = {
|
|
path = '~/parsers/tree-sitter-zimbu',
|
|
-- optional entries
|
|
location = 'parser',
|
|
generate = true,
|
|
generate_from_json = false,
|
|
},
|
|
```
|
|
This will always use the state of the directory as-is (i.e., `branch` and `revision` will be ignored).
|
|
|
|
2. If the parser name differs from the filetype(s) used by Neovim, you need to register the parser via
|
|
|
|
```lua
|
|
vim.treesitter.language.register('zimbu', { 'zu' })
|
|
```
|
|
|
|
If Neovim does not detect your language's filetype by default, you can use [Neovim's `vim.filetype.add()`](<https://neovim.io/doc/user/lua.html#vim.filetype.add()>) to add a custom detection rule.
|
|
|
|
3. Start `nvim` and `:TSInstall zimbu`.
|
|
|
|
>[!IMPORTANT]
|
|
> Parsers using external scanner need to be written in C.
|
|
|
|
### Modifying parsers
|
|
|
|
You can use the same approach for overriding parser information. E.g., if you always want to generate the `lua` parser from grammar, add
|
|
```lua
|
|
vim.api.nvim_create_autocmd('User', { pattern = 'TSUpdate',
|
|
callback = function()
|
|
require('nvim-treesitter.parsers').lua.install_info.generate = true
|
|
end})
|
|
```
|
|
|
|
## Adding queries
|
|
|
|
Queries can be placed anywhere in your `runtimepath` under `queries/<language>`, with earlier directories taking precedence unless the queries are marked with `; extends`; see [`:h treesitter-query-modelines`](https://neovim.io/doc/user/treesitter.html#treesitter-query-modeline).
|
|
|
|
E.g., to add queries for `zimbu`, put `highlights.scm` etc. under
|
|
```lua
|
|
vim.fn.stdpath('data') .. 'site/queries/zimbu'
|
|
```
|