better regex for matching emacs modeline

the emacs modeline is actually a per-file variable setting mechanism, which means it can have other flags in it.

this regex extracts the part that corresponds to the file's language ("mode:" - ie emacs major mode)

http://ergoemacs.org/emacs_manual/emacs/Specifying-File-Variables.html
This commit is contained in:
Michael Tesch
2015-03-14 18:35:57 +01:00
parent 3745308642
commit 068c8a341d

View File

@@ -1,7 +1,7 @@
module Linguist
module Strategy
class Modeline
EmacsModeline = /-\*-\s*mode:\s*(\w+);?\s*-\*-/i
EmacsModeline = /-\*-\s*((?!mode)[\w-]+\s*:\s*([\w+-]+)\s*;?\s*)?(mode\s*:)?\s*([\w+-]+)\s*;?\s*((?!mode)[\w-]+\s*:\s*([\w+-]+)\s*;?\s*)?-\*-/i
VimModeline = /\/\*\s*vim:\s*set\s*(?:ft|filetype)=(\w+):\s*\*\//i
# Public: Detects language based on Vim and Emacs modelines
@@ -22,9 +22,14 @@ module Linguist
#
# Returns a String or nil
def self.modeline(data)
match = data.match(EmacsModeline) || data.match(VimModeline)
match = data.match(EmacsModeline)
if match
match[4]
else
match = data.match(VimModeline)
match[1] if match
end
end
end
end
end