mirror of
https://github.com/helix-editor/helix.git
synced 2025-01-19 13:37:06 +04:00
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.
This commit is contained in:
parent
db3470d973
commit
08ee949dcb
@ -28,4 +28,13 @@ # in <config_dir>/helix/languages.toml
|
||||
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.
|
||||
|
@ -445,6 +445,7 @@ pub fn change<I>(document: &Document, changes: I) -> Self
|
||||
auto_pairs: None,
|
||||
}],
|
||||
grammar: vec![],
|
||||
grammar_selection: None,
|
||||
});
|
||||
|
||||
// set runtime path so we can find the queries
|
||||
|
@ -81,12 +81,21 @@ pub fn deserialize_auto_pairs<'de, D>(deserializer: D) -> Result<Option<AutoPair
|
||||
}
|
||||
|
||||
#[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 @@ fn test_parser() {
|
||||
let loader = Loader::new(Configuration {
|
||||
language: vec![],
|
||||
grammar: vec![],
|
||||
grammar_selection: None,
|
||||
});
|
||||
|
||||
let language = get_language(&crate::RUNTIME_DIR, "Rust").unwrap();
|
||||
|
@ -7,7 +7,7 @@
|
||||
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<()> {
|
||||
|
Loading…
Reference in New Issue
Block a user