Skip to content

Commit

Permalink
Refactor shebang detection to reuse the loaded buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
archseer committed Nov 8, 2021
1 parent 77dbbc7 commit 549cdee
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 9 deletions.
11 changes: 3 additions & 8 deletions helix-core/src/syntax.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ use std::{
cell::RefCell,
collections::{HashMap, HashSet},
fmt,
fs::File,
io::Read,
path::Path,
sync::Arc,
};
Expand Down Expand Up @@ -308,15 +306,12 @@ impl Loader {
// TODO: content_regex handling conflict resolution
}

pub fn language_config_for_shebang(&self, path: &Path) -> Option<Arc<LanguageConfiguration>> {
// Read the first 128 bytes of the file. If its a shebang line, try to find the language
let file = File::open(path).ok()?;
let mut buf = String::with_capacity(128);
file.take(128).read_to_string(&mut buf).ok()?;
pub fn language_config_for_shebang(&self, source: &Rope) -> Option<Arc<LanguageConfiguration>> {
let line = Cow::from(source.line(0));
static SHEBANG_REGEX: Lazy<Regex> =
Lazy::new(|| Regex::new(r"^#!\s*(?:\S*[/\\](?:env\s+)?)?([^\s\.\d]+)").unwrap());
let configuration_id = SHEBANG_REGEX
.captures(&buf)
.captures(&line)
.and_then(|cap| self.language_config_ids_by_shebang.get(&cap[1]));

configuration_id.and_then(|&id| self.language_configs.get(id).cloned())
Expand Down
2 changes: 1 addition & 1 deletion helix-view/src/document.rs
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,7 @@ impl Document {
if let Some(path) = &self.path {
let language_config = config_loader
.language_config_for_file_name(path)
.or_else(|| config_loader.language_config_for_shebang(path));
.or_else(|| config_loader.language_config_for_shebang(self.text()));
self.set_language(theme, language_config);
}
}
Expand Down

0 comments on commit 549cdee

Please sign in to comment.