tree-sitter-d2

Table of Contents
Description
Tree Sitter grammar for d2lang (github). It's not yet finished, but
usable for every-day cases with support for latest features like globs, filters
and variables.
The goal is to provide better experience for existing keywords, code blocks
injections, folds, etc.
- Better parsing of modern structures - The latest supported version of d2
is v0.6.9.
- Built with nvim-treesitter in mind - We respect and follow its
highlight groups.
- Keywords - All keywords from the documentation are treated as such.
(Open an issue if any are missing.)
- Tests - We aim to cover all edge cases and examples from the
documentation, resulting in more robust parsing. Currently, we have more
than 100 tests. (This will be reduced later when the grammar becomes stable.)
I've never done anything remotely close to parsing grammar, so there could be
some bad patterns and simply bad code. Feel free to open issues.
Installation
Neovim
local parser_config = require("nvim-treesitter.parsers").get_parser_configs()
parser_config.d2 = {
install_info = {
url = "https://github.com/ravsii/tree-sitter-d2",
files = { "src/parser.c" },
branch = "main"
},
filetype = "d2",
}
vim.filetype.add({
extension = {
d2 = function()
return "d2", function(bufnr)
vim.bo[bufnr].commentstring = "# %s"
end
end,
},
})
- Do
:TSInstall d2
- Copy queries to one of your
rtp
paths. Usually ~/.config/nvim/
will do
the job. You can check it using :echo &rtp
command.
Example using ~/.config/nvim
~/.config/nvim/queries/d2
├── highlights.scm
├── injections.scm
└── locals.scm
Example using default nvim-treesitter dir with lazy.nvim
~/.local/share/nvim/lazy/nvim-treesitter/queries/d2
├── highlights.scm
├── injections.scm
└── locals.scm
- Check if
:TSModuleInfo
has highlight
option enabled.
Helix
Fortunately Helix has it's own guide on how to add new languages and
grammars.
A quick example for installing d2
would be:
- Add new language to
languages.toml
[[language]]
name = "d2"
scope = "source.git"
file-types = ["d2"]
comment-token = "#"
roots = [""]
indent = { tab-width = 2, unit = " " }
[[grammar]]
source = { git = "https://github.com/ravsii/tree-sitter-d2", rev = "main" }
name = "d2"
hx --grammar fetch
&& hx --grammar build
- Add your queries to
~/.config/helix/runtime/queries/d2
~/.config/helix/runtime/queries/d2
├── highlights.scm
├── injections.scm
└── locals.scm
Other editors
If you're using some other editor that's using tree-sitter, please open an
issue. Would be great if you could also provide instructions for other how to
install it.
Showcase
Tokyo Night Storm
theme with CaskaydiaCove
font.
Props to Neovim's Tokyo Night theme for supporting pretty much every
highlighting group.
https://github.com/user-attachments/assets/a9bd20d0-eb6c-43c2-8e58-7d211d350025
Contribution
See CONTRIBUTION.md
Comparison
This section is outdated and not maintained
Actually, there's another tree-sitter-d2 by pleshevskiy. My project's initial
goal was to fix issues his grammar had, but later I realized that his grammar
is not maintained and lacks many features d2
has added since then.
Here's a list of comparisons as of v0.2
version of this project, both using
Tokyonight Storm
theme.
Please note that:
- On the left is our project using Neovim, on the right is pleshevskiy's
grammar using Helix (I was unable to install pleshevskiy's grammar in Neovim)
- Some example are my random homework, thus being in Russian, please don't try
make sense of them. Thanks! :D
Better consistency overall

Better handling of foreign languages
