Tree-sitter Neovim Config Cheatsheet
treesitter is a parser for programming and scripting languages. Tree-sitter helps with syntax highlighting, code formatting and for looking up code function definitions right from your code editor.
What Does a Tree-sitter Parser Do?
- Syntax Highlighting
Traditional syntax highlighting relies on regex-based matching, which can sometimes be slow or inaccurate. Tree-sitter parsers create a structured tree of the code, which allows Neovim to highlight syntax more accurately, even in complex or nested structures.
- Code Folding
By understanding the syntax tree, Tree-sitter enables smarter code folding. It knows where logical blocks of code start and end (like functions, loops, or templates).
- Code Navigation
Tree-sitter parsers allow features like jumping to function definitions, finding usages, or moving through the structure of a file based on its syntax.
- Error Detection
Tree-sitter can help detect syntax errors in real-time, as it builds a detailed understanding of the language’s structure.
- Language Awareness for Linting and Refactoring
The syntax tree helps plugins and tools provide advanced features like linting, auto-formatting, and refactoring (e.g., renaming variables).
- Multi-Language Support
Tree-sitter parsers can handle embedded languages (e.g., JavaScript inside HTML or Twig). This is useful for templating languages or polyglot codebases.
How Does a Tree-sitter Parser Work?
Lexical Analysis: The parser tokenizes the input code into meaningful chunks (like keywords, identifiers, or operators).
Parsing: It builds a syntax tree by analyzing the relationships between tokens based on the language’s grammar.
Output: The result is a syntax tree that tools like Neovim can use for features like highlighting and navigation.
Tree-sitter in Neovim
- Neovim uses Tree-sitter for modern, efficient language parsing.
- Parsers for specific languages are installed via the nvim-treesitter plugin.
- Once installed, Neovim uses the parser for advanced features like highlighting and folding.
Example Configuration
1
2
3
4
5
6
7
8
9
require'nvim-treesitter.configs'.setup {
ensure_installed = { "javascript", "python", "html", "css", "twig" }, -- Install parsers
highlight = {
enable = true, -- Enable syntax highlighting
},
indent = {
enable = true, -- Enable smart indentation
},
}
Benefits of Tree-sitter
- Accuracy: It understands nested structures better than regex.
- Speed: Efficient and lightweight, even for large files.
- Extensibility: Easy to add custom parsers or extend features for new languages.
Downside
- Parsers need to be developed for each language, and not all languages/templates are supported by default.
Install
Add treesitter to your vim plugins
1
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}
Install parsers
1
:TSInstall twig
Update all parsers
1
:TSUpdate all
Load the treesitter init.lua file
When vim starts, load the treesitter init file with a config of your choice
1
source $HOME/.config/nvim/plug-config/treesitter.lua
treesitter.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
require'nvim-treesitter.configs'.setup {
-- A list of parser names, or "all" (the five listed parsers should always be installed)
ensure_installed = { "c", "lua", "vim", "vimdoc", "query" },
-- Install parsers synchronously (only applied to `ensure_installed`)
sync_install = false,
-- Automatically install missing parsers when entering buffer
-- Recommendation: set to false if you don't have `tree-sitter` CLI installed locally
auto_install = true,
-- List of parsers to ignore installing (for "all")
ignore_install = { "javascript" },
---- If you need to change the installation directory of the parsers (see -> Advanced Setup)
-- parser_install_dir = "/some/path/to/store/parsers", -- Remember to run vim.opt.runtimepath:append("/some/path/to/store/parsers")!
highlight = {
enable = true,
-- NOTE: these are the names of the parsers and not the filetype. (for example if you want to
-- disable highlighting for the `tex` filetype, you need to include `latex` in this list as this is
-- the name of the parser)
-- list of language that will be disabled
disable = { "c", "rust" },
-- Or use a function for more flexibility, e.g. to disable slow treesitter highlight for large files
disable = function(lang, buf)
local max_filesize = 100 * 1024 -- 100 KB
local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf))
if ok and stats and stats.size > max_filesize then
return true
end
end,
-- 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,
},
}
Check if a parser is installed
1
:TSInstallInfo
Check health
1
:checkhealth nvim-treesitter
Ensure all your languages have all the treesitter features enabled
Fixing Language Errors
If the language features are not enabled. You can enable them all by running:
1
:TSUpdate javascript
Update
If you get errors everytime you open neovim try running
1
:TSUpdate