Neovim and Tree-Sitter Post-Archival
On April 3rd, 2026, the lauded nvim-treesitter was archived, due to maintainer burnout.1 This post introduces tree-sitter-dl, a simple Python script I wrote to replace one of the primary functionalities of nvim-treesitter: parser installation. My goals for the script were the following:
- Easy to use
- No dependencies, other than the obvious ones2
- Flexible
- Fast enough
If you want to get started using tree-sitter-dl, check out the GitHub repository. In the rest of this post, I will go over the main features of the script.
Overview
I will walk through installing a parser for the Zig programming language. Basic parser installation looks like this:
./tree-sitter-dl.py install zig
This will install parsers, queries, and a lock file into the following locations depending on your OS:
| OS | Path |
|---|---|
| Unix | $XDG_CONFIG_HOME/nvim or ~/.config/nvim |
| Windows | %LOCALAPPDATA%\nvim or %USERPROFILE%\AppData\Local |
This should be the location of your Neovim config directory. If you would like
to specify an installation location instead, use the -o option:
./tree-sitter-dl.py install zig -o my-install-dir
Make sure that the installation location is in your Neovim runtimepath so that
Neovim can find it!3 Now try editing a .zig file with this content:
const std = @import("std");
pub fn main(init: std.process.Init) !void {
std.debug.print("All your {s} are belong to us.\n", .{"codebase"});
}
You shouldn't see any tree-sitter highlights yet! To activate them, run
:lua vim.treesitter.start()! If you want to automate this process, the
following into ftplugin/zig.lua:4
vim.treesitter.start()
-- Uncomment if you want tree-sitter folding
-- vim.wo[0][0].foldexpr = 'v:lua.vim.treesitter.foldexpr()'
-- vim.wo[0][0].foldmethod = 'expr'
Specific Parser Repositories
Many languages have multiple different tree-sitter parser implementations. For example, for Lua, there's:
tree-sitter-dl will automatically try to select the best implementation. If
you have a specific implementation in mind, though, you can run something like:
./tree-sitter-dl.py install lua:https://github.com/Azganoth/tree-sitter-lua
If you want to get more specific, like retrieving a specfic version, run:
# Tag
./tree-sitter-dl.py install lua:https://github.com/Azganoth/tree-sitter-lua@v2.1.3
# Commit SHA
./tree-sitter-dl.py install lua:https://github.com/Azganoth/tree-sitter-lua@7ab58496586502285a944e380b2cf05339035844
# Branch
./tree-sitter-dl.py install lua:https://github.com/Azganoth/tree-sitter-lua@shebang-magic
This flexibility is important for some parsers. For exmaple, I personally use the following to install my Python parser:
./tree-sitter-dl.py install python:https://github.com/tree-sitter/tree-sitter-python@v0.25.0
Uninstalling
Run the following to uninstall parser(s):
./tree-sitter-dl.py uninstall zig
DO NOT REMOVE THE PARSER FILES YOURSELF! Trying to do so might mess up the lock file that tree-sitter-dl maintains.
WebAssembly
By default, parsers are shared libraries (i.e. .so, .dll, or .dylib
files). Thus, you should only install trusted parsers from trusted sources on
your machine, because if a parser is run, it can do anything it wants (under
your user permissions).
However, if your parser is bundled as a WebAssembly module, you can achieve both portability and safety. tree-sitter-dl supports this:
./tree-sitter-dl.py install zig --wasm
Note that, to use WebAssembly parsers, Neovim must be built with
ENABLE_WASMTIME. Check out the Neovim docs for
building from source. Fair warning: this feature is somewhat incomplete; I
ran into numerous different crashes while running Neovim like this.5
Listing Installed Parsers
Installed parsers can be listed like this:
./tree-sitter-dl.py list
It is useful to use the -v flag for more detailed output:
./tree-sitter-dl.py list -v
Wrap Up
I hope this post was helpful! If you interested in tree-sitter-dl, check out the GitHub repository. The script is not perfect, but I hope it gets the job done for you.
As always, if you had questions, comments, or issues with this post, let me know by posting an issue.
From what it looks like, one of the primary motivators of the burnout was the amount of rude and uninformed comments the maintainer received whilst rewriting nvim-treesitter. I hope this stands as a lesson to be kind to maintainers, and to not fall back to posting an issue at the first sign of hardship when using an open source project. ↩︎
Python 3, tree-sitter CLI, and git should be in your
PATH. ↩︎The location of your Neovim config should be in
runtimepathalready, so installation should work by default. ↩︎If you haven't already, you can create
ftplugin/zig.luain your configuration directory. ↩︎At the time of writing, of course. ↩︎