summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Davis2022-02-15 05:23:01 +0000
committerBlaž Hrastnik2022-03-10 08:31:57 +0000
commit08ee949dcb904dc27aa41a62ad686c14c0a406bb (patch)
tree60c897b886751612b51de60705112b4a0c929b76
parentdb3470d973ed97445d180c18035c2858e4749782 (diff)
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.
-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<()> {