π³ Tree-sitter grammar for the Ohm domain-specific language. Quickly build parsers, interpreters, and compilers for programming languages with Ohm's parsing toolkit!
Grammar definition resides in grammar.js
:
- Actual grammar and bindings are generated from it via Tree-sitter.
- Queries and tests rely on its namings of nodes and fields.
Generic queries are structured as follows:
queries/
|-- highlights.scm -- syntax highlighting queries (generic, for Tree-sitter & GitHub)
|-- locals.scm -- fixed set of capture names to track local scopes and variables (and alike)
|-- injections.scm -- specification for embedded syntaxes (mainly used for TODO/FIXME highlighting in comments)
`-- tags.scm -- tagging queries for code navigation systems (as used on GitHub)
To find highlighting and other queries for specific editors, look in the editor_queries/
directory.
Installation assumes you're using lazy.nvim
as a plugin manager:
Instructions
-
Clone the repo to any convenient place:
git clone https://github.com/novusnota/tree-sitter-ohm ~/.local/git/tree-sitter-ohm
(~/.local/git
is exemplary, you may choose another directory) -
Add the following (partly or as a whole) to your
~/.config/nvim/init.lua
(Or~\AppData\Local\nvim\init.lua
on Windows):
For the general Tree-sitter support:
-- lazy.nvim package manager
require('lazy').setup({
-- ...
{
-- Highlight, edit, and navigate code
'nvim-treesitter/nvim-treesitter',
build = ':TSUpdate',
-- Optional, may be removed:
dependencies = {
-- adds syntax aware text-objects, select, move, swap, and peek support
-- see: https://github.com/nvim-treesitter/nvim-treesitter-textobjects
'nvim-treesitter/nvim-treesitter-textobjects',
-- adds a sticky context header on top as you scroll through file contents
-- see: https://github.com/nvim-treesitter/nvim-treesitter-context
'nvim-treesitter/nvim-treesitter-context'
},
},
-- ...
}, {})
For the tree-sitter-ohm support:
local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
-- Adds tree-sitter-ohm support
parser_config.ohm = {
install_info = {
url = "~/.local/git/tree-sitter-ohm", -- a path to the cloned repo
files = {"src/parser.c", "src/scanner.c"},
branch = "main",
generate_requires_npm = false,
requires_generate_from_grammar = false,
}
}
-- Adds filetype recognition for .ohm files and simple indentation rules
vim.api.nvim_create_autocmd({"BufEnter", "BufWinEnter"}, {
pattern = "*.ohm",
callback = function()
vim.bo.filetype = "ohm"
vim.bo.expandtab = true
vim.bo.softtabstop = 2
vim.bo.shiftwidth = 2
end
})
- Create a folder for queries under your Neovim runtime directory, if not exists:
- Windows:
mkdir -p ~\AppData\Local\nvim\queries
- Linux, macOS, *NIX:
mkdir -p ~/.config/nvim/queries
- Symlink the
editor_queries/neovim
sub-directory, this will add all the queries:
- Windows:
mklink /D ~\AppData\Local\nvim\queries\ohm ~\.local\git\tree-sitter-ohm\editor_queries\neovim
- Linux, macOS, *NIX:
ln -s ~/.local/git/tree-sitter-ohm/editor_queries/neovim ~/.config/nvim/queries/ohm
-
Finally, run the
:TSInstall ohm
inside the Neovim. -
For further configuration and customization, refer to the following repositories:
Queries bundled (see editor_queries/neovim
):
highlights.scm
β syntax highlightinglocals.scm
β used to extract keyword definitions, scopes, references, etc., but NOT used for highlighting (unlike Generic or Helix queries)injections.scm
β highlighting of TODO, FIXME and related in single-line commentsfolds.scm
β syntax folds (note, that folding has to be enabled in config in order to use those)indents.scm
β indentation levelstextobjects.scm
β syntax aware text-objects, select, move, swap, and peek support.context.scm
β shows sticky context on top of the editor as you scroll through file contents
Instructions
-
Clone the repo to any convenient place:
git clone https://github.com/novusnota/tree-sitter-ohm ~/.local/git/tree-sitter-ohm
(~/.local/git
is exemplary, you may choose another directory) -
Create a folder for queries under your Helix runtime directory, if not exists:
- Windows:
mkdir -p ~\AppData\Roaming\helix\runtime\queries
- Linux, macOS, *NIX:
mkdir -p ~/.config/helix/runtime/queries
- Symlink the
editor_queries/helix
sub-directory, this will add all the queries:
- Windows:
mklink /D ~\AppData\Roaming\helix\runtime\queries\ohm ~\.local\git\tree-sitter-ohm\editor_queries\helix
- Linux, macOS, *NIX:
ln -s ~/.local/git/tree-sitter-ohm/editor_queries/helix ~/.config/helix/runtime/queries/ohm
- Add the following to your
~/.config/helix/languages.toml
(Or~\AppData\Roaming\helix\languages.toml
on Windows):
[[language]]
name = "ohm"
scope = "source.ohm"
injection-regex = "ohm"
file-types = ["ohm"]
comment-token = "//"
indent = { tab-width = 2, unit = " " }
roots = []
[language.auto-pairs]
'"' = '"'
'{' = '}'
'(' = ')'
'<' = '>'
[[grammar]]
name = "ohm"
source = { path = "/absolute/path/to/your/home/directory/.local/git/tree-sitter-ohm" } # TODO: replace with your full path to downloaded repo
- Finally, run the following commands to update all Tree-sitter grammars, including ohm's:
hx --grammar fetch
hx --grammar build
Queries bundled (see editor_queries/helix
):
highlights.scm
β syntax highlightinginjections.scm
β highlighting of TODO, FIXME and related in single-line commentsindents.scm
β indentation levelstextobjects.scm
β syntax aware text-objects
Tree-sitter grammars have limited utility on their own and are best used as parsers that can be embedded in other projects. However, tree-sitter-cli can be used with this grammar to show generated parse trees and syntax highlighting for a given ohm file.
For a quick demo of tree-sitter-cli usage:
- Clone this repo.
- Install Node.js dependencies (by
npm i
,pnpm i
oryarn
). - Execute relevant commands from the
scripts
tag inpackage.json
.
For a more streamlined experience, you may:
- Install tree-sitter-cli.
- Create a
tree-sitters
directory in your home directory. - Clone this repository (or symlink it) into the new
~/tree-sitters/
directory. - Run
tree-sitter parse path/to/file.ohm
to be shown the parse tree for the file. - Run
tree-sitter highlight path/to/file.ohm
to be shown the file with syntax highlighting applied.
- ohm-grammar.ohm β Official grammar specification of Ohm PEG language, written itself in Ohm!
Examples in test/sample
directory are taken from ohmjs/ohm under MIT license.
Built with π€ by Novus Nota