diff --git a/lib/linguist/strategy/modeline.rb b/lib/linguist/strategy/modeline.rb index 8e13c829..24108c6f 100644 --- a/lib/linguist/strategy/modeline.rb +++ b/lib/linguist/strategy/modeline.rb @@ -23,8 +23,20 @@ module Linguist # # Returns a String or nil def self.modeline(data) - data.lines.first(5).any? { |l| l.match(/\W(?:filetype=|ft=|-\*- mode:|-\*-)\s*(\w+)/) } - lang = $1 + pattern = %q{(?: + (-\*- \s* (?:mode:)? \s*) | # $1: Emacs + (\/\* \s* vim: \s* set \s* (?:ft|filetype)=) # $2: Vim + ) + (\w+) # $3: language + (?: + (?(1) # If $1 matched... + ;?\s* -\*- | # then close Emacs syntax + : \s* \*\/ # otherwise close Vim syntax + ) + )} + + data.lines.first(5).any? { |l| l.match(/#{pattern}/x) } + lang = $3 end end end