This grammar implements the vimdoc "spec" (ref1, ref2). Predictable results are the primary goal, so that output formats (e.g. HTML) are well-formed; the input (vimdoc) is secondary. The first step should always be to try to fix the input rather than insist on a grammar that handles vimdoc's endless quirks.
- blockis the main top-level node, delimited by blank line(s) or any line starting with- <(codeblock terminator).- contains lineandline_linodes.
 
- contains 
- line:- contains atoms (words, tags, taglinks, …)
- contains headings (h1,h2,h3,column_heading) becausecodeblockterminated by "implicit stop" (no terminating<) consumes blank lines, soblockhas no way to end.
 
- line_li("listitem")- lines starting with -/•(not+/*) are listitems.
- consumes lines until blank line, codeblock, or next listitem.
- nesting is ignored: indented listitems are parsed as siblings.
 
- lines starting with 
- codeblock:- contained by lineorline_li, because ">" can start a codeblock at the end of any line.
- contains linenodes withoutwordnodes: it's just the full raw text line including whitespace. This is somewhat dictated by its "preformatted" nature; parsing the contents would require loading a "child" language (injection). See #2.
- the terminating <(and any following whitespace) is discarded (anonymous).
 
- contained by 
- h1= "Heading 1":- ======followed by text and optional- *tags*.
- h2= "Heading 2":- ------followed by text and optional- *tags*.
- h3= "Heading 3": UPPERCASE WORDS, followed by optional- *tags*, followed by atoms.
- Input must end with newline/EOL (\n). Grammar does not support files without EOL.
- Input must end with a blank line. Though this doesn't seem to matter in practice.
- Spec requires that codeblockdelimiter ">" must be preceded by a space (" >"), not a tab. But currently the grammar doesn't enforce this. Example::help lcs-tab.
- urldoesn't handle surrounding parens. E.g.- (https://example.com/#yay)yields- word
- urldoesn't handle nested parens. E.g.- (https://example.com/(foo)#yay)
- column_headingcurrently only recognizes tilde- ~preceded by space (i.e.- foo ~not- foo~). This covers 99% of :help files.
- column_headingchildren should be plaintext, but currently are parsed as- $._atom.
- modelinemust be preceded by a blank line.
- tag_heading: line(s) containing only tags, typically implies a "heading" before a block.
Steps to perform a release:
- 
Bump and tag the version: First bump Cargo.toml,pyproject.toml, andMakefileto the new version. Then bump the package:npm version patch -m "release %s"Choose patch/minor/majorto indicate query compatibility:- patchfor bugfixes (no changes to queries needed)
- minorfor added nodes (queries may need changes to use new nodes but will not error)
- majorfor removed or renamed nodes (queries will error if not adapted), other breaking changes
 
- 
Bump to prerelease, without creating a tag: npm version --no-git-tag-version prerelease --preid dev git add package*.json Cargo.toml pyproject.toml Makefile git commit -m bump
- 
Push: git push && git push --tags
- 
Release the tagged commit: https://github.com/neovim/tree-sitter-vimdoc/releases/new