pull/11885/head
archseer 3 years ago
parent 0e50d5916e
commit 0e78ce2ba5

@ -138,37 +138,55 @@
<div id="content" class="content">
<main>
<h1 id="adding-languages"><a class="header" href="#adding-languages">Adding languages</a></h1>
<h2 id="submodules"><a class="header" href="#submodules">Submodules</a></h2>
<p>To add a new language, you should first add a tree-sitter submodule. To do this,
you can run the command</p>
<pre><code class="language-sh">git submodule add -f &lt;repository&gt; helix-syntax/languages/tree-sitter-&lt;name&gt;
</code></pre>
<p>For example, to add tree-sitter-ocaml you would run</p>
<pre><code class="language-sh">git submodule add -f https://github.com/tree-sitter/tree-sitter-ocaml helix-syntax/languages/tree-sitter-ocaml
</code></pre>
<p>Make sure the submodule is shallow by doing</p>
<pre><code class="language-sh">git config -f .gitmodules submodule.helix-syntax/languages/tree-sitter-&lt;name&gt;.shallow true
</code></pre>
<p>or you can manually add <code>shallow = true</code> to <code>.gitmodules</code>.</p>
<h2 id="languagestoml"><a class="header" href="#languagestoml">languages.toml</a></h2>
<p>Next, you need to add the language to the <a href="https://github.com/helix-editor/helix/blob/master/languages.toml"><code>languages.toml</code></a> found in the root of
the repository; this <code>languages.toml</code> file is included at compilation time, and
is distinct from the <code>language.toml</code> file in the user's <a href="../configuration.html">configuration
<h2 id="language-configuration"><a class="header" href="#language-configuration">Language configuration</a></h2>
<p>To add a new language, you need to add a <code>language</code> entry to the
<a href="https://github.com/helix-editor/helix/blob/master/languages.toml"><code>languages.toml</code></a> found in the root of the repository;
this <code>languages.toml</code> file is included at compilation time, and is
distinct from the <code>languages.toml</code> file in the user's <a href="../configuration.html">configuration
directory</a>.</p>
<pre><code class="language-toml">[[language]]
name = &quot;mylang&quot;
scope = &quot;scope.mylang&quot;
injection-regex = &quot;^mylang$&quot;
file-types = [&quot;mylang&quot;, &quot;myl&quot;]
comment-token = &quot;#&quot;
indent = { tab-width = 2, unit = &quot; &quot; }
</code></pre>
<p>These are the available keys and descriptions for the file.</p>
<table><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody>
<tr><td>name</td><td>The name of the language</td></tr>
<tr><td>scope</td><td>A string like <code>source.js</code> that identifies the language. Currently, we strive to match the scope names used by popular TextMate grammars and by the Linguist library. Usually <code>source.&lt;name&gt;</code> or <code>text.&lt;name&gt;</code> in case of markup languages</td></tr>
<tr><td>injection-regex</td><td>regex pattern that will be tested against a language name in order to determine whether this language should be used for a potential <a href="https://tree-sitter.github.io/tree-sitter/syntax-highlighting#language-injection">language injection</a> site.</td></tr>
<tr><td>file-types</td><td>The filetypes of the language, for example <code>[&quot;yml&quot;, &quot;yaml&quot;]</code></td></tr>
<tr><td>shebangs</td><td>The interpreters from the shebang line, for example <code>[&quot;sh&quot;, &quot;bash&quot;]</code></td></tr>
<tr><td>roots</td><td>A set of marker files to look for when trying to find the workspace root. For example <code>Cargo.lock</code>, <code>yarn.lock</code></td></tr>
<tr><td>auto-format</td><td>Whether to autoformat this language when saving</td></tr>
<tr><td>diagnostic-severity</td><td>Minimal severity of diagnostic for it to be displayed. (Allowed values: <code>Error</code>, <code>Warning</code>, <code>Info</code>, <code>Hint</code>)</td></tr>
<tr><td>comment-token</td><td>The token to use as a comment-token</td></tr>
<tr><td>indent</td><td>The indent to use. Has sub keys <code>tab-width</code> and <code>unit</code></td></tr>
<tr><td>config</td><td>Language server configuration</td></tr>
<tr><td><code>name</code></td><td>The name of the language</td></tr>
<tr><td><code>scope</code></td><td>A string like <code>source.js</code> that identifies the language. Currently, we strive to match the scope names used by popular TextMate grammars and by the Linguist library. Usually <code>source.&lt;name&gt;</code> or <code>text.&lt;name&gt;</code> in case of markup languages</td></tr>
<tr><td><code>injection-regex</code></td><td>regex pattern that will be tested against a language name in order to determine whether this language should be used for a potential <a href="https://tree-sitter.github.io/tree-sitter/syntax-highlighting#language-injection">language injection</a> site.</td></tr>
<tr><td><code>file-types</code></td><td>The filetypes of the language, for example <code>[&quot;yml&quot;, &quot;yaml&quot;]</code>. Extensions and full file names are supported.</td></tr>
<tr><td><code>shebangs</code></td><td>The interpreters from the shebang line, for example <code>[&quot;sh&quot;, &quot;bash&quot;]</code></td></tr>
<tr><td><code>roots</code></td><td>A set of marker files to look for when trying to find the workspace root. For example <code>Cargo.lock</code>, <code>yarn.lock</code></td></tr>
<tr><td><code>auto-format</code></td><td>Whether to autoformat this language when saving</td></tr>
<tr><td><code>diagnostic-severity</code></td><td>Minimal severity of diagnostic for it to be displayed. (Allowed values: <code>Error</code>, <code>Warning</code>, <code>Info</code>, <code>Hint</code>)</td></tr>
<tr><td><code>comment-token</code></td><td>The token to use as a comment-token</td></tr>
<tr><td><code>indent</code></td><td>The indent to use. Has sub keys <code>tab-width</code> and <code>unit</code></td></tr>
<tr><td><code>config</code></td><td>Language server configuration</td></tr>
<tr><td><code>grammar</code></td><td>The tree-sitter grammar to use (defaults to the value of <code>name</code>)</td></tr>
</tbody></table>
<h2 id="grammar-configuration"><a class="header" href="#grammar-configuration">Grammar configuration</a></h2>
<p>If a tree-sitter grammar is available for the language, add a new <code>grammar</code>
entry to <code>languages.toml</code>.</p>
<pre><code class="language-toml">[[grammar]]
name = &quot;mylang&quot;
source = { git = &quot;https://github.com/example/mylang&quot;, rev = &quot;a250c4582510ff34767ec3b7dcdd3c24e8c8aa68&quot; }
</code></pre>
<p>Grammar configuration takes these keys:</p>
<table><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody>
<tr><td><code>name</code></td><td>The name of the tree-sitter grammar</td></tr>
<tr><td><code>source</code></td><td>The method of fetching the grammar - a table with a schema defined below</td></tr>
</tbody></table>
<p>Where <code>source</code> is a table with either these keys when using a grammar from a
git repository:</p>
<table><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody>
<tr><td><code>git</code></td><td>A git remote URL from which the grammar should be cloned</td></tr>
<tr><td><code>rev</code></td><td>The revision (commit hash or tag) which should be fetched</td></tr>
<tr><td><code>subpath</code></td><td>A path within the grammar directory which should be built. Some grammar repositories host multiple grammars (for example <code>tree-sitter-typescript</code> and <code>tree-sitter-ocaml</code>) in subdirectories. This key is used to point <code>hx --grammar build</code> to the correct path for compilation. When omitted, the root of repository is used</td></tr>
</tbody></table>
<p>Or a <code>path</code> key with an absolute path to a locally available grammar directory.</p>
<h2 id="queries"><a class="header" href="#queries">Queries</a></h2>
<p>For a language to have syntax-highlighting and indentation among
other things, you have to add queries. Add a directory for your
@ -178,21 +196,16 @@ gives more info on how to write queries.</p>
<blockquote>
<p>NOTE: When evaluating queries, the first matching query takes
precedence, which is different from other editors like neovim where
the last matching query supercedes the ones before it. See
the last matching query supersedes the ones before it. See
<a href="https://github.com/helix-editor/helix/pull/1170#issuecomment-997294090">this issue</a> for an example.</p>
</blockquote>
<h2 id="common-issues"><a class="header" href="#common-issues">Common Issues</a></h2>
<ul>
<li>
<p>If you get errors when building after switching branches, you may have to remove or update tree-sitter submodules. You can update submodules by running</p>
<pre><code class="language-sh">git submodule sync; git submodule update --init
</code></pre>
</li>
<li>
<p>Make sure to not use the <code>--remote</code> flag. To remove submodules look inside the <code>.gitmodules</code> and remove directories that are not present inside of it.</p>
<p>If you get errors when running after switching branches, you may have to update the tree-sitter grammars. Run <code>hx --grammar fetch</code> to fetch the grammars and <code>hx --grammar build</code> to build any out-of-date grammars.</p>
</li>
<li>
<p>If a parser is segfaulting or you want to remove the parser, make sure to remove the submodule <em>and</em> the compiled parser in <code>runtime/grammar/&lt;name&gt;.so</code></p>
<p>If a parser is segfaulting or you want to remove the parser, make sure to remove the compiled parser in <code>runtime/grammar/&lt;name&gt;.so</code></p>
</li>
<li>
<p>The indents query is <code>indents.toml</code>, <em>not</em> <code>indents.scm</code>. See <a href="https://github.com/helix-editor/helix/issues/114">this</a> issue for more information.</p>

@ -163,7 +163,7 @@ configure Nix to use cached outputs when possible.</p>
sudo dnf install helix
</code></pre>
<h2 id="build-from-source"><a class="header" href="#build-from-source">Build from source</a></h2>
<pre><code>git clone --recurse-submodules --shallow-submodules -j8 https://github.com/helix-editor/helix
<pre><code>git clone https://github.com/helix-editor/helix
cd helix
cargo install --path helix-term
</code></pre>
@ -171,6 +171,10 @@ cargo install --path helix-term
<p>Helix also needs it's runtime files so make sure to copy/symlink the <code>runtime/</code> directory into the
config directory (for example <code>~/.config/helix/runtime</code> on Linux/macOS). This location can be overriden
via the <code>HELIX_RUNTIME</code> environment variable.</p>
<h2 id="building-tree-sitter-grammars"><a class="header" href="#building-tree-sitter-grammars">Building tree-sitter grammars</a></h2>
<p>Tree-sitter grammars must be fetched and compiled if not pre-packaged.
Fetch grammars with <code>hx --grammar fetch</code> (requires <code>git</code>) and compile them
with <code>hx --grammar build</code> (requires a C compiler).</p>
</main>

@ -163,7 +163,7 @@ configure Nix to use cached outputs when possible.</p>
sudo dnf install helix
</code></pre>
<h2 id="build-from-source"><a class="header" href="#build-from-source">Build from source</a></h2>
<pre><code>git clone --recurse-submodules --shallow-submodules -j8 https://github.com/helix-editor/helix
<pre><code>git clone https://github.com/helix-editor/helix
cd helix
cargo install --path helix-term
</code></pre>
@ -171,6 +171,10 @@ cargo install --path helix-term
<p>Helix also needs it's runtime files so make sure to copy/symlink the <code>runtime/</code> directory into the
config directory (for example <code>~/.config/helix/runtime</code> on Linux/macOS). This location can be overriden
via the <code>HELIX_RUNTIME</code> environment variable.</p>
<h2 id="building-tree-sitter-grammars"><a class="header" href="#building-tree-sitter-grammars">Building tree-sitter grammars</a></h2>
<p>Tree-sitter grammars must be fetched and compiled if not pre-packaged.
Fetch grammars with <code>hx --grammar fetch</code> (requires <code>git</code>) and compile them
with <code>hx --grammar build</code> (requires a C compiler).</p>
</main>

@ -140,12 +140,31 @@
<h1 id="languages"><a class="header" href="#languages">Languages</a></h1>
<p>Language-specific settings and settings for particular language servers can be configured in a <code>languages.toml</code> file placed in your <a href="./configuration.html">configuration directory</a>. Helix actually uses two <code>languages.toml</code> files, the <a href="https://github.com/helix-editor/helix/blob/master/languages.toml">first one</a> is in the main helix repository; it contains the default settings for each language and is included in the helix binary at compile time. Users who want to see the available settings and options can either reference the helix repo's <code>languages.toml</code> file, or consult the table in the <a href="./guides/adding_languages.html">adding languages</a> section.</p>
<p>Changes made to the <code>languages.toml</code> file in a user's <a href="./configuration.html">configuration directory</a> are merged with helix's defaults on start-up, such that a user's settings will take precedence over defaults in the event of a collision. For example, the default <code>languages.toml</code> sets rust's <code>auto-format</code> to <code>true</code>. If a user wants to disable auto-format, they can change the <code>languages.toml</code> in their <a href="./configuration.html">configuration directory</a> to make the rust entry read like the example below; the new key/value pair <code>auto-format = false</code> will override the default when the two sets of settings are merged on start-up:</p>
<pre><code># in &lt;config_dir&gt;/helix/languages.toml
<pre><code class="language-toml"># in &lt;config_dir&gt;/helix/languages.toml
[[language]]
name = &quot;rust&quot;
auto-format = false
</code></pre>
<h2 id="tree-sitter-grammars"><a class="header" href="#tree-sitter-grammars">Tree-sitter grammars</a></h2>
<p>Tree-sitter grammars can also be configured in <code>languages.toml</code>:</p>
<pre><code class="language-toml"># in &lt;config_dir&gt;/helix/languages.toml
[[grammar]]
name = &quot;rust&quot;
source = { git = &quot;https://github.com/tree-sitter/tree-sitter-rust&quot;, rev = &quot;a250c4582510ff34767ec3b7dcdd3c24e8c8aa68&quot; }
[[grammar]]
name = &quot;c&quot;
source = { path = &quot;/path/to/tree-sitter-c&quot; }
</code></pre>
<p>You may use a top-level <code>use-grammars</code> key to control which grammars are fetched and built.</p>
<pre><code class="language-toml"># Note: this key must come **before** the [[language]] and [[grammar]] sections
use-grammars = { only = [ &quot;rust&quot;, &quot;c&quot;, &quot;cpp&quot; ] }
# or
use-grammars = { except = [ &quot;yaml&quot;, &quot;json&quot; ] }
</code></pre>
<p>When omitted, all grammars are fetched and built.</p>
</main>

@ -164,7 +164,7 @@ configure Nix to use cached outputs when possible.</p>
sudo dnf install helix
</code></pre>
<h2 id="build-from-source"><a class="header" href="#build-from-source">Build from source</a></h2>
<pre><code>git clone --recurse-submodules --shallow-submodules -j8 https://github.com/helix-editor/helix
<pre><code>git clone https://github.com/helix-editor/helix
cd helix
cargo install --path helix-term
</code></pre>
@ -172,6 +172,10 @@ cargo install --path helix-term
<p>Helix also needs it's runtime files so make sure to copy/symlink the <code>runtime/</code> directory into the
config directory (for example <code>~/.config/helix/runtime</code> on Linux/macOS). This location can be overriden
via the <code>HELIX_RUNTIME</code> environment variable.</p>
<h2 id="building-tree-sitter-grammars"><a class="header" href="#building-tree-sitter-grammars">Building tree-sitter grammars</a></h2>
<p>Tree-sitter grammars must be fetched and compiled if not pre-packaged.
Fetch grammars with <code>hx --grammar fetch</code> (requires <code>git</code>) and compile them
with <code>hx --grammar build</code> (requires a C compiler).</p>
<div style="break-before: page; page-break-before: always;"></div><h1 id="usage"><a class="header" href="#usage">Usage</a></h1>
<p>(Currently not fully documented, see the <a href="./keymap.html">keymappings</a> list for more.)</p>
<p>See <a href="https://github.com/helix-editor/helix/blob/master/runtime/tutor.txt">tutor.txt</a> (accessible via <code>hx --tutor</code> or <code>:tutor</code>) for a vimtutor-like introduction.</p>
@ -1148,47 +1152,84 @@ j = { k = &quot;normal_mode&quot; } # Maps `jk` to exit insert mode
<div style="break-before: page; page-break-before: always;"></div><h1 id="languages"><a class="header" href="#languages">Languages</a></h1>
<p>Language-specific settings and settings for particular language servers can be configured in a <code>languages.toml</code> file placed in your <a href="./configuration.html">configuration directory</a>. Helix actually uses two <code>languages.toml</code> files, the <a href="https://github.com/helix-editor/helix/blob/master/languages.toml">first one</a> is in the main helix repository; it contains the default settings for each language and is included in the helix binary at compile time. Users who want to see the available settings and options can either reference the helix repo's <code>languages.toml</code> file, or consult the table in the <a href="./guides/adding_languages.html">adding languages</a> section.</p>
<p>Changes made to the <code>languages.toml</code> file in a user's <a href="./configuration.html">configuration directory</a> are merged with helix's defaults on start-up, such that a user's settings will take precedence over defaults in the event of a collision. For example, the default <code>languages.toml</code> sets rust's <code>auto-format</code> to <code>true</code>. If a user wants to disable auto-format, they can change the <code>languages.toml</code> in their <a href="./configuration.html">configuration directory</a> to make the rust entry read like the example below; the new key/value pair <code>auto-format = false</code> will override the default when the two sets of settings are merged on start-up:</p>
<pre><code># in &lt;config_dir&gt;/helix/languages.toml
<pre><code class="language-toml"># in &lt;config_dir&gt;/helix/languages.toml
[[language]]
name = &quot;rust&quot;
auto-format = false
</code></pre>
<h2 id="tree-sitter-grammars"><a class="header" href="#tree-sitter-grammars">Tree-sitter grammars</a></h2>
<p>Tree-sitter grammars can also be configured in <code>languages.toml</code>:</p>
<pre><code class="language-toml"># in &lt;config_dir&gt;/helix/languages.toml
[[grammar]]
name = &quot;rust&quot;
source = { git = &quot;https://github.com/tree-sitter/tree-sitter-rust&quot;, rev = &quot;a250c4582510ff34767ec3b7dcdd3c24e8c8aa68&quot; }
[[grammar]]
name = &quot;c&quot;
source = { path = &quot;/path/to/tree-sitter-c&quot; }
</code></pre>
<p>You may use a top-level <code>use-grammars</code> key to control which grammars are fetched and built.</p>
<pre><code class="language-toml"># Note: this key must come **before** the [[language]] and [[grammar]] sections
use-grammars = { only = [ &quot;rust&quot;, &quot;c&quot;, &quot;cpp&quot; ] }
# or
use-grammars = { except = [ &quot;yaml&quot;, &quot;json&quot; ] }
</code></pre>
<p>When omitted, all grammars are fetched and built.</p>
<div style="break-before: page; page-break-before: always;"></div><h1 id="guides"><a class="header" href="#guides">Guides</a></h1>
<p>This section contains guides for adding new language server configurations,
tree-sitter grammers, textobject queries, etc.</p>
<div style="break-before: page; page-break-before: always;"></div><h1 id="adding-languages"><a class="header" href="#adding-languages">Adding languages</a></h1>
<h2 id="submodules"><a class="header" href="#submodules">Submodules</a></h2>
<p>To add a new language, you should first add a tree-sitter submodule. To do this,
you can run the command</p>
<pre><code class="language-sh">git submodule add -f &lt;repository&gt; helix-syntax/languages/tree-sitter-&lt;name&gt;
</code></pre>
<p>For example, to add tree-sitter-ocaml you would run</p>
<pre><code class="language-sh">git submodule add -f https://github.com/tree-sitter/tree-sitter-ocaml helix-syntax/languages/tree-sitter-ocaml
</code></pre>
<p>Make sure the submodule is shallow by doing</p>
<pre><code class="language-sh">git config -f .gitmodules submodule.helix-syntax/languages/tree-sitter-&lt;name&gt;.shallow true
</code></pre>
<p>or you can manually add <code>shallow = true</code> to <code>.gitmodules</code>.</p>
<h2 id="languagestoml"><a class="header" href="#languagestoml">languages.toml</a></h2>
<p>Next, you need to add the language to the <a href="https://github.com/helix-editor/helix/blob/master/languages.toml"><code>languages.toml</code></a> found in the root of
the repository; this <code>languages.toml</code> file is included at compilation time, and
is distinct from the <code>language.toml</code> file in the user's <a href="guides/../configuration.html">configuration
<h2 id="language-configuration"><a class="header" href="#language-configuration">Language configuration</a></h2>
<p>To add a new language, you need to add a <code>language</code> entry to the
<a href="https://github.com/helix-editor/helix/blob/master/languages.toml"><code>languages.toml</code></a> found in the root of the repository;
this <code>languages.toml</code> file is included at compilation time, and is
distinct from the <code>languages.toml</code> file in the user's <a href="guides/../configuration.html">configuration
directory</a>.</p>
<pre><code class="language-toml">[[language]]
name = &quot;mylang&quot;
scope = &quot;scope.mylang&quot;
injection-regex = &quot;^mylang$&quot;
file-types = [&quot;mylang&quot;, &quot;myl&quot;]
comment-token = &quot;#&quot;
indent = { tab-width = 2, unit = &quot; &quot; }
</code></pre>
<p>These are the available keys and descriptions for the file.</p>
<table><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody>
<tr><td>name</td><td>The name of the language</td></tr>
<tr><td>scope</td><td>A string like <code>source.js</code> that identifies the language. Currently, we strive to match the scope names used by popular TextMate grammars and by the Linguist library. Usually <code>source.&lt;name&gt;</code> or <code>text.&lt;name&gt;</code> in case of markup languages</td></tr>
<tr><td>injection-regex</td><td>regex pattern that will be tested against a language name in order to determine whether this language should be used for a potential <a href="https://tree-sitter.github.io/tree-sitter/syntax-highlighting#language-injection">language injection</a> site.</td></tr>
<tr><td>file-types</td><td>The filetypes of the language, for example <code>[&quot;yml&quot;, &quot;yaml&quot;]</code></td></tr>
<tr><td>shebangs</td><td>The interpreters from the shebang line, for example <code>[&quot;sh&quot;, &quot;bash&quot;]</code></td></tr>
<tr><td>roots</td><td>A set of marker files to look for when trying to find the workspace root. For example <code>Cargo.lock</code>, <code>yarn.lock</code></td></tr>
<tr><td>auto-format</td><td>Whether to autoformat this language when saving</td></tr>
<tr><td>diagnostic-severity</td><td>Minimal severity of diagnostic for it to be displayed. (Allowed values: <code>Error</code>, <code>Warning</code>, <code>Info</code>, <code>Hint</code>)</td></tr>
<tr><td>comment-token</td><td>The token to use as a comment-token</td></tr>
<tr><td>indent</td><td>The indent to use. Has sub keys <code>tab-width</code> and <code>unit</code></td></tr>
<tr><td>config</td><td>Language server configuration</td></tr>
<tr><td><code>name</code></td><td>The name of the language</td></tr>
<tr><td><code>scope</code></td><td>A string like <code>source.js</code> that identifies the language. Currently, we strive to match the scope names used by popular TextMate grammars and by the Linguist library. Usually <code>source.&lt;name&gt;</code> or <code>text.&lt;name&gt;</code> in case of markup languages</td></tr>
<tr><td><code>injection-regex</code></td><td>regex pattern that will be tested against a language name in order to determine whether this language should be used for a potential <a href="https://tree-sitter.github.io/tree-sitter/syntax-highlighting#language-injection">language injection</a> site.</td></tr>
<tr><td><code>file-types</code></td><td>The filetypes of the language, for example <code>[&quot;yml&quot;, &quot;yaml&quot;]</code>. Extensions and full file names are supported.</td></tr>
<tr><td><code>shebangs</code></td><td>The interpreters from the shebang line, for example <code>[&quot;sh&quot;, &quot;bash&quot;]</code></td></tr>
<tr><td><code>roots</code></td><td>A set of marker files to look for when trying to find the workspace root. For example <code>Cargo.lock</code>, <code>yarn.lock</code></td></tr>
<tr><td><code>auto-format</code></td><td>Whether to autoformat this language when saving</td></tr>
<tr><td><code>diagnostic-severity</code></td><td>Minimal severity of diagnostic for it to be displayed. (Allowed values: <code>Error</code>, <code>Warning</code>, <code>Info</code>, <code>Hint</code>)</td></tr>
<tr><td><code>comment-token</code></td><td>The token to use as a comment-token</td></tr>
<tr><td><code>indent</code></td><td>The indent to use. Has sub keys <code>tab-width</code> and <code>unit</code></td></tr>
<tr><td><code>config</code></td><td>Language server configuration</td></tr>
<tr><td><code>grammar</code></td><td>The tree-sitter grammar to use (defaults to the value of <code>name</code>)</td></tr>
</tbody></table>
<h2 id="grammar-configuration"><a class="header" href="#grammar-configuration">Grammar configuration</a></h2>
<p>If a tree-sitter grammar is available for the language, add a new <code>grammar</code>
entry to <code>languages.toml</code>.</p>
<pre><code class="language-toml">[[grammar]]
name = &quot;mylang&quot;
source = { git = &quot;https://github.com/example/mylang&quot;, rev = &quot;a250c4582510ff34767ec3b7dcdd3c24e8c8aa68&quot; }
</code></pre>
<p>Grammar configuration takes these keys:</p>
<table><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody>
<tr><td><code>name</code></td><td>The name of the tree-sitter grammar</td></tr>
<tr><td><code>source</code></td><td>The method of fetching the grammar - a table with a schema defined below</td></tr>
</tbody></table>
<p>Where <code>source</code> is a table with either these keys when using a grammar from a
git repository:</p>
<table><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody>
<tr><td><code>git</code></td><td>A git remote URL from which the grammar should be cloned</td></tr>
<tr><td><code>rev</code></td><td>The revision (commit hash or tag) which should be fetched</td></tr>
<tr><td><code>subpath</code></td><td>A path within the grammar directory which should be built. Some grammar repositories host multiple grammars (for example <code>tree-sitter-typescript</code> and <code>tree-sitter-ocaml</code>) in subdirectories. This key is used to point <code>hx --grammar build</code> to the correct path for compilation. When omitted, the root of repository is used</td></tr>
</tbody></table>
<p>Or a <code>path</code> key with an absolute path to a locally available grammar directory.</p>
<h2 id="queries"><a class="header" href="#queries">Queries</a></h2>
<p>For a language to have syntax-highlighting and indentation among
other things, you have to add queries. Add a directory for your
@ -1198,21 +1239,16 @@ gives more info on how to write queries.</p>
<blockquote>
<p>NOTE: When evaluating queries, the first matching query takes
precedence, which is different from other editors like neovim where
the last matching query supercedes the ones before it. See
the last matching query supersedes the ones before it. See
<a href="https://github.com/helix-editor/helix/pull/1170#issuecomment-997294090">this issue</a> for an example.</p>
</blockquote>
<h2 id="common-issues"><a class="header" href="#common-issues">Common Issues</a></h2>
<ul>
<li>
<p>If you get errors when building after switching branches, you may have to remove or update tree-sitter submodules. You can update submodules by running</p>
<pre><code class="language-sh">git submodule sync; git submodule update --init
</code></pre>
</li>
<li>
<p>Make sure to not use the <code>--remote</code> flag. To remove submodules look inside the <code>.gitmodules</code> and remove directories that are not present inside of it.</p>
<p>If you get errors when running after switching branches, you may have to update the tree-sitter grammars. Run <code>hx --grammar fetch</code> to fetch the grammars and <code>hx --grammar build</code> to build any out-of-date grammars.</p>
</li>
<li>
<p>If a parser is segfaulting or you want to remove the parser, make sure to remove the submodule <em>and</em> the compiled parser in <code>runtime/grammar/&lt;name&gt;.so</code></p>
<p>If a parser is segfaulting or you want to remove the parser, make sure to remove the compiled parser in <code>runtime/grammar/&lt;name&gt;.so</code></p>
</li>
<li>
<p>The indents query is <code>indents.toml</code>, <em>not</em> <code>indents.scm</code>. See <a href="https://github.com/helix-editor/helix/issues/114">this</a> issue for more information.</p>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save