summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--book/src/languages.md2
-rw-r--r--helix-core/src/syntax.rs14
-rw-r--r--languages.toml2
3 files changed, 15 insertions, 3 deletions
diff --git a/book/src/languages.md b/book/src/languages.md
index 73c81213..9b90a211 100644
--- a/book/src/languages.md
+++ b/book/src/languages.md
@@ -50,7 +50,7 @@ These configuration keys are available:
| `name` | The name of the language |
| `scope` | A string like `source.js` that identifies the language. Currently, we strive to match the scope names used by popular TextMate grammars and by the Linguist library. Usually `source.<name>` or `text.<name>` in case of markup languages |
| `injection-regex` | regex pattern that will be tested against a language name in order to determine whether this language should be used for a potential [language injection][treesitter-language-injection] site. |
-| `file-types` | The filetypes of the language, for example `["yml", "yaml"]`. Extensions and full file names are supported. |
+| `file-types` | The filetypes of the language, for example `["yml", "yaml"]`. This attempts to match by exact file name (`.zshrc`), then by file extension (`toml`), then by path suffix (`.git/config`). |
| `shebangs` | The interpreters from the shebang line, for example `["sh", "bash"]` |
| `roots` | A set of marker files to look for when trying to find the workspace root. For example `Cargo.lock`, `yarn.lock` |
| `auto-format` | Whether to autoformat this language when saving |
diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs
index a08e5084..f9a2ea5f 100644
--- a/helix-core/src/syntax.rs
+++ b/helix-core/src/syntax.rs
@@ -471,9 +471,10 @@ impl Loader {
for file_type in &config.file_types {
// entry().or_insert(Vec::new).push(language_id);
+ let file_type = file_type.replace('/', &std::path::MAIN_SEPARATOR.to_string());
loader
.language_config_ids_by_file_type
- .insert(file_type.clone(), language_id);
+ .insert(file_type, language_id);
}
for shebang in &config.shebangs {
loader
@@ -498,6 +499,17 @@ impl Loader {
path.extension()
.and_then(|extension| extension.to_str())
.and_then(|extension| self.language_config_ids_by_file_type.get(extension))
+ })
+ .or_else(|| {
+ self.language_config_ids_by_file_type
+ .iter()
+ .find_map(|(file_type, id)| {
+ if path.to_str()?.ends_with(file_type) {
+ Some(id)
+ } else {
+ None
+ }
+ })
});
configuration_id.and_then(|&id| self.language_configs.get(id).cloned())
diff --git a/languages.toml b/languages.toml
index 39b81731..ce3ba20a 100644
--- a/languages.toml
+++ b/languages.toml
@@ -1054,7 +1054,7 @@ name = "git-config"
scope = "source.gitconfig"
roots = []
# TODO: allow specifying file-types as a regex so we can read directory names (e.g. `.git/config`)
-file-types = [".gitmodules", ".gitconfig"]
+file-types = [".gitmodules", ".gitconfig", ".git/config", ".config/git/config"]
injection-regex = "git-config"
comment-token = "#"
indent = { tab-width = 4, unit = "\t" }