diff --git a/book/src/languages.md b/book/src/languages.md index 73c8121311e5..9b90a2112b52 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.` or `text.` 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 b5083f55cacf..42333c37a062 100644 --- a/helix-core/src/syntax.rs +++ b/helix-core/src/syntax.rs @@ -465,9 +465,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 @@ -492,6 +493,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 39b81731fb79..ce3ba20adc38 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" }