diff options
author | Michael Davis | 2022-02-15 05:23:01 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2022-03-10 08:31:57 +0000 |
commit | 08ee949dcb904dc27aa41a62ad686c14c0a406bb (patch) | |
tree | 60c897b886751612b51de60705112b4a0c929b76 | |
parent | db3470d973ed97445d180c18035c2858e4749782 (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.md | 11 | ||||
-rw-r--r-- | helix-core/src/indent.rs | 1 | ||||
-rw-r--r-- | helix-core/src/syntax.rs | 12 | ||||
-rw-r--r-- | helix-term/src/grammars.rs | 16 |
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<()> { |