Unnamed repository; edit this file 'description' to name the repository.
add 'use-grammars' to languages.toml
The vision with 'use-grammars' is to allow the long-requested feature of being able to declare your own set of grammars that you would like. A simple schema with only/except grammar names controls the list of grammars that is fetched and built. It does not (yet) control which grammars may be loaded at runtime if they already exist.
Michael Davis 2022-03-10
parent db3470d · commit 08ee949
-rw-r--r--book/src/languages.md11
-rw-r--r--helix-core/src/indent.rs1
-rw-r--r--helix-core/src/syntax.rs12
-rw-r--r--helix-term/src/grammars.rs16
4 files changed, 36 insertions, 4 deletions
diff --git a/book/src/languages.md b/book/src/languages.md
index c5a7708fa..3372a1202 100644
--- a/book/src/languages.md
+++ b/book/src/languages.md
@@ -28,4 +28,13 @@ name = "c"
source = { path = "/path/to/tree-sitter-c" }
```
-If a user has a `languages.toml`, only the grammars in that `languages.toml` are evaluated when running `hx --fetch-grammars` and `hx --build-grammars`. Otherwise the [default `languages.toml`](https://github.com/helix-editor/helix/blob/master/languages.toml) is used.
+You may use a top-level `use-grammars` key to control which grammars are fetched and built.
+
+```toml
+# Note: this key must come **before** the [[language]] and [[grammar]] sections
+use-grammars = { only = [ "rust", "c", "cpp" ] }
+# or
+use-grammars = { except = [ "yaml", "json" ] }
+```
+
+When omitted, all grammars are fetched and built.
diff --git a/helix-core/src/indent.rs b/helix-core/src/indent.rs
index ba02065c7..ee9cbb165 100644
--- a/helix-core/src/indent.rs
+++ b/helix-core/src/indent.rs
@@ -445,6 +445,7 @@ where
auto_pairs: None,
}],
grammar: vec![],
+ grammar_selection: None,
});
// set runtime path so we can find the queries
diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs
index 52239d100..28aa31f99 100644
--- a/helix-core/src/syntax.rs
+++ b/helix-core/src/syntax.rs
@@ -81,12 +81,21 @@ where
}
#[derive(Debug, Serialize, Deserialize)]
-#[serde(deny_unknown_fields)]
+#[serde(rename_all = "kebab-case", deny_unknown_fields)]
pub struct Configuration {
+ #[serde(rename = "use-grammars")]
+ pub grammar_selection: Option<GrammarSelection>,
pub language: Vec<LanguageConfiguration>,
pub grammar: Vec<GrammarConfiguration>,
}
+#[derive(Debug, Serialize, Deserialize)]
+#[serde(rename_all = "lowercase", untagged)]
+pub enum GrammarSelection {
+ Only(HashSet<String>),
+ Except(HashSet<String>),
+}
+
// largely based on tree-sitter/cli/src/loader.rs
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case", deny_unknown_fields)]
@@ -2110,6 +2119,7 @@ mod test {
let loader = Loader::new(Configuration {
language: vec![],
grammar: vec![],
+ grammar_selection: None,
});
let language = get_language(&crate::RUNTIME_DIR, "Rust").unwrap();
diff --git a/helix-term/src/grammars.rs b/helix-term/src/grammars.rs
index 7a7a4c187..2e0be4bcb 100644
--- a/helix-term/src/grammars.rs
+++ b/helix-term/src/grammars.rs
@@ -7,7 +7,7 @@ use std::{
sync::mpsc::channel,
};
-use helix_core::syntax::{GrammarConfiguration, GrammarSource, DYLIB_EXTENSION};
+use helix_core::syntax::{GrammarConfiguration, GrammarSelection, GrammarSource, DYLIB_EXTENSION};
const BUILD_TARGET: &str = env!("BUILD_TARGET");
const REMOTE_NAME: &str = "origin";
@@ -163,7 +163,19 @@ fn build_grammar(grammar: GrammarConfiguration) -> Result<()> {
fn get_grammar_configs() -> Vec<GrammarConfiguration> {
let config = helix_core::config::user_syntax_loader().expect("Could not parse languages.toml");
- config.grammar
+ match config.grammar_selection {
+ Some(GrammarSelection::Only(selections)) => config
+ .grammar
+ .into_iter()
+ .filter(|grammar| selections.contains(&grammar.grammar_id))
+ .collect(),
+ Some(GrammarSelection::Except(rejections)) => config
+ .grammar
+ .into_iter()
+ .filter(|grammar| !rejections.contains(&grammar.grammar_id))
+ .collect(),
+ None => config.grammar,
+ }
}
fn build_tree_sitter_library(src_path: &Path, grammar: GrammarConfiguration) -> Result<()> {