@@ -8,10 +8,7 @@ use syntect::dumps::{dump_to_file, from_binary, from_reader};
88use syntect::highlighting::{Theme, ThemeSet};
99use syntect::parsing::{SyntaxDefinition, SyntaxSet};
1010
11−#[cfg(unix)]
12−use std::os::unix::fs::FileTypeExt;
13−
14−use inputfile::InputFile;
11+use inputfile::{InputFile, InputFileReader};
1512
1613lazy_static! {
1714 static ref PROJECT_DIRS: ProjectDirs =
@@ -166,27 +163,33 @@ impl HighlightingAssets {
166163 }
167164 }
168165
169− pub fn get_syntax(&self, language: Option<&str>, filename: InputFile) -> &SyntaxDefinition {
166+ pub fn get_syntax(
167+ &self,
168+ language: Option<&str>,
169+ filename: InputFile,
170+ reader: &mut InputFileReader,
171+ ) -> &SyntaxDefinition {
170172 let syntax = match (language, filename) {
171173 (Some(language), _) => self.syntax_set.find_syntax_by_token(language),
172174 (None, InputFile::Ordinary(filename)) => {
173− #[cfg(not(unix))]
174− let may_read_from_file = true;
175−
176− // Do not peek at the file (to determine the syntax) if it is a FIFO because they can
177− // only be read once.
178− #[cfg(unix)]
179− let may_read_from_file = !fs::metadata(filename)
180− .map(|m| m.file_type().is_fifo())
181− .unwrap_or(false);
182−
183− if may_read_from_file {
184− self.syntax_set
185− .find_syntax_for_file(filename)
186− .unwrap_or(None)
175+ let path = Path::new(filename);
176+ let file_name = path.file_name().and_then(|n| n.to_str()).unwrap_or("");
177+ let extension = path.extension().and_then(|x| x.to_str()).unwrap_or("");
178+ let ext_syntax = self
179+ .syntax_set
180+ .find_syntax_by_extension(file_name)
181+ .or_else(|| self.syntax_set.find_syntax_by_extension(extension));
182+ let line_syntax = if ext_syntax.is_none() {
183+ reader
184+ .get_first_line()
185+ .ok()
186+ .and_then(|v| String::from_utf8(v).ok())
187+ .and_then(|l| self.syntax_set.find_syntax_by_first_line(&l))
187188 } else {
188189 None
189− }
190+ };
191+ let syntax = ext_syntax.or(line_syntax);
192+ syntax
190193 }
191194 (None, InputFile::StdIn) => None,
192195 (_, InputFile::ThemePreviewFile) => self.syntax_set.find_syntax_by_name("Rust"),