@@ -251,29 +251,42 @@ impl HighlightingAssets {
253 fn get_extension_syntax(&self, file_name: &OsStr) -> Option<&SyntaxReference> {
253 fn get_extension_syntax(&self, file_name: &OsStr) -> Option<&SyntaxReference> {
254+ self.find_syntax_by_file_name(file_name).or_else(|| {
255+ self.find_syntax_by_file_name_extension(file_name)
256+ .or_else(|| self.get_extension_syntax_with_stripped_suffix(file_name))
260+ fn find_syntax_by_file_name(&self, file_name: &OsStr) -> Option<&SyntaxReference> {
254 self.get_syntax_set()
261 self.get_syntax_set()
255 .find_syntax_by_extension(file_name.to_str().unwrap_or_default())
262 .find_syntax_by_extension(file_name.to_str().unwrap_or_default())
265+ fn find_syntax_by_file_name_extension(&self, file_name: &OsStr) -> Option<&SyntaxReference> {
257− let file_path = Path::new(file_name);
266+ let file_path = Path::new(file_name);
258− self.get_syntax_set()
259− .find_syntax_by_extension(
267+ self.get_syntax_set().find_syntax_by_extension(
260− file_path
268+ file_path
261− .extension()
269+ .extension()
262− .and_then(|x| x.to_str())
270+ .and_then(|x| x.to_str())
263− .unwrap_or_default(),
271+ .unwrap_or_default(),
275+ /// If we find an ignored suffix on the file name, e.g. '~', we strip it and
276+ /// then try again to find a syntax without it. Note that we do this recursively.
277+ fn get_extension_syntax_with_stripped_suffix(
280+ ) -> Option<&SyntaxReference> {
281+ let file_path = Path::new(file_name);
266− if let Some(file_str) = file_path.to_str() {
282+ if let Some(file_str) = file_path.to_str() {
267− for suffix in IGNORED_SUFFIXES.iter() {
283+ for suffix in IGNORED_SUFFIXES.iter() {
268− if let Some(stripped_filename) = file_str.strip_suffix(suffix) {
284+ if let Some(stripped_filename) = file_str.strip_suffix(suffix) {
270− .get_extension_syntax(OsStr::new(stripped_filename));
285+ return self.get_extension_syntax(OsStr::new(stripped_filename));
279 fn get_first_line_syntax(&self, reader: &mut InputReader) -> Option<&SyntaxReference> {
292 fn get_first_line_syntax(&self, reader: &mut InputReader) -> Option<&SyntaxReference> {