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 c5a7708f..3372a120 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 ba02065c..ee9cbb16 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 52239d10..28aa31f9 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 7a7a4c18..2e0be4bc 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<()> {