Post

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?

  1. 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.

  1. 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).

  1. 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.

  1. Error Detection

Tree-sitter can help detect syntax errors in real-time, as it builds a detailed understanding of the language’s structure.

  1. 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).

  1. 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?

  1. Lexical Analysis: The parser tokenizes the input code into meaningful chunks (like keywords, identifiers, or operators).

  2. Parsing: It builds a syntax tree by analyzing the relationships between tokens based on the language’s grammar.

  3. 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 treesitter language features

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
This post is licensed under CC BY 4.0 by the author.