mirror of
https://github.com/KevinMidboe/linguist.git
synced 2026-02-10 10:19:40 +00:00
Merge pull request #3237 from github/3227-local
Revised Emacs modeline detection
This commit is contained in:
@@ -1,7 +1,37 @@
|
|||||||
module Linguist
|
module Linguist
|
||||||
module Strategy
|
module Strategy
|
||||||
class Modeline
|
class Modeline
|
||||||
EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
|
EMACS_MODELINE = /
|
||||||
|
-\*-
|
||||||
|
(?:
|
||||||
|
# Short form: `-*- ruby -*-`
|
||||||
|
\s* (?= [^:;\s]+ \s* -\*-)
|
||||||
|
|
|
||||||
|
# Longer form: `-*- foo:bar; mode: ruby; -*-`
|
||||||
|
(?:
|
||||||
|
.*? # Preceding variables: `-*- foo:bar bar:baz;`
|
||||||
|
[;\s] # Which are delimited by spaces or semicolons
|
||||||
|
|
|
||||||
|
(?<=-\*-) # Not preceded by anything: `-*-mode:ruby-*-`
|
||||||
|
)
|
||||||
|
mode # Major mode indicator
|
||||||
|
\s*:\s* # Allow whitespace around colon: `mode : ruby`
|
||||||
|
)
|
||||||
|
([^:;\s]+) # Name of mode
|
||||||
|
|
||||||
|
# Ensure the mode is terminated correctly
|
||||||
|
(?=
|
||||||
|
# Followed by semicolon or whitespace
|
||||||
|
[\s;]
|
||||||
|
|
|
||||||
|
# Touching the ending sequence: `ruby-*-`
|
||||||
|
(?<![-*]) # Don't allow stuff like `ruby--*-` to match; it'll invalidate the mode
|
||||||
|
-\*- # Emacs has no problems reading `ruby --*-`, however.
|
||||||
|
)
|
||||||
|
.*? # Anything between a cleanly-terminated mode and the ending -*-
|
||||||
|
-\*-
|
||||||
|
/xi
|
||||||
|
|
||||||
VIM_MODELINE = /
|
VIM_MODELINE = /
|
||||||
|
|
||||||
# Start modeline. Could be `vim:`, `vi:` or `ex:`
|
# Start modeline. Could be `vim:`, `vi:` or `ex:`
|
||||||
|
|||||||
3
test/fixtures/Data/Modelines/seeplusplusEmacs10
vendored
Normal file
3
test/fixtures/Data/Modelines/seeplusplusEmacs10
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
// -*- foo-bar mode: c++ -*-
|
||||||
|
|
||||||
|
"Malformed modeline, but still understood by Emacs to be C++."
|
||||||
1
test/fixtures/Data/Modelines/seeplusplusEmacs11
vendored
Normal file
1
test/fixtures/Data/Modelines/seeplusplusEmacs11
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/* -*- mode: c++ -------*- */
|
||||||
1
test/fixtures/Data/Modelines/seeplusplusEmacs12
vendored
Normal file
1
test/fixtures/Data/Modelines/seeplusplusEmacs12
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
-*--------- foo:bar mode: c++ -*-
|
||||||
@@ -9,6 +9,7 @@ class TestGrammars < Minitest::Test
|
|||||||
"vendor/grammars/go-tmbundle",
|
"vendor/grammars/go-tmbundle",
|
||||||
"vendor/grammars/jflex.tmbundle",
|
"vendor/grammars/jflex.tmbundle",
|
||||||
"vendor/grammars/language-csharp",
|
"vendor/grammars/language-csharp",
|
||||||
|
"vendor/grammars/language-viml",
|
||||||
"vendor/grammars/sublimeassembly"
|
"vendor/grammars/sublimeassembly"
|
||||||
].freeze
|
].freeze
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ class TestModelines < Minitest::Test
|
|||||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs7")
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs7")
|
||||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs8")
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs8")
|
||||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs9")
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs9")
|
||||||
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs10")
|
||||||
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs11")
|
||||||
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs12")
|
||||||
assert_modeline Language["Text"], fixture_blob("Data/Modelines/fundamentalEmacs.c")
|
assert_modeline Language["Text"], fixture_blob("Data/Modelines/fundamentalEmacs.c")
|
||||||
assert_modeline Language["Prolog"], fixture_blob("Data/Modelines/not_perl.pl")
|
assert_modeline Language["Prolog"], fixture_blob("Data/Modelines/not_perl.pl")
|
||||||
assert_modeline Language["Smalltalk"], fixture_blob("Data/Modelines/example_smalltalk.md")
|
assert_modeline Language["Smalltalk"], fixture_blob("Data/Modelines/example_smalltalk.md")
|
||||||
@@ -53,6 +56,9 @@ class TestModelines < Minitest::Test
|
|||||||
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs7").language
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs7").language
|
||||||
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs8").language
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs8").language
|
||||||
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs9").language
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs9").language
|
||||||
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs10").language
|
||||||
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs11").language
|
||||||
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs12").language
|
||||||
assert_equal Language["Text"], fixture_blob("Data/Modelines/fundamentalEmacs.c").language
|
assert_equal Language["Text"], fixture_blob("Data/Modelines/fundamentalEmacs.c").language
|
||||||
assert_equal Language["Prolog"], fixture_blob("Data/Modelines/not_perl.pl").language
|
assert_equal Language["Prolog"], fixture_blob("Data/Modelines/not_perl.pl").language
|
||||||
assert_equal Language["Smalltalk"], fixture_blob("Data/Modelines/example_smalltalk.md").language
|
assert_equal Language["Smalltalk"], fixture_blob("Data/Modelines/example_smalltalk.md").language
|
||||||
|
|||||||
Reference in New Issue
Block a user