blob: cf4a2c69d504dc85e1ea9b0dc7f4281d494c303a [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Mail file
3" Previous Maintainer: Felix von Leitner <leitner@math.fu-berlin.de>
Bram Moolenaarf1568ec2011-12-14 21:17:39 +01004" Maintainer: GI <a@b.c>, where a='gi1242+vim', b='gmail', c='com'
5" Last Change: Sat 03 Dec 2011 10:34:27 PM EST
Bram Moolenaar071d4272004-06-13 20:20:40 +00006
7" Quit when a syntax file was already loaded
8if exists("b:current_syntax")
9 finish
10endif
11
12" The mail header is recognized starting with a "keyword:" line and ending
13" with an empty line or other line that can't be in the header. All lines of
14" the header are highlighted. Headers of quoted messages (quoted with >) are
15" also highlighted.
16
17" Syntax clusters
18syn cluster mailHeaderFields contains=mailHeaderKey,mailSubject,mailHeaderEmail,@mailLinks
19syn cluster mailLinks contains=mailURL,mailEmail
20syn cluster mailQuoteExps contains=mailQuoteExp1,mailQuoteExp2,mailQuoteExp3,mailQuoteExp4,mailQuoteExp5,mailQuoteExp6
21
22syn case match
23" For "From " matching case is required. The "From " is not matched in quoted
24" emails
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000025" According to RFC 2822 any printable ASCII character can appear in a field
26" name, except ':'.
Bram Moolenaar5c736222010-01-06 20:54:52 +010027syn region mailHeader contains=@mailHeaderFields,@NoSpell start="^From .*\d\d\d\d$" skip="^\s" end="\v^[!-9;-~]*([^!-~]|$)"me=s-1 fold
Bram Moolenaarc1a11ed2008-06-24 22:09:24 +000028syn match mailHeaderKey contained contains=mailEmail,@NoSpell "^From\s.*\d\d\d\d$"
Bram Moolenaar5c736222010-01-06 20:54:52 +010029
30" Nothing else depends on case.
31syn case ignore
32
33" Headers in properly quoted (with "> " or ">") emails are matched
34syn region mailHeader keepend contains=@mailHeaderFields,@mailQuoteExps,@NoSpell start="^\z(\(> \?\)*\)\v(newsgroups|x-([a-z\-])*|path|xref|message-id|from|((in-)?reply-)?to|b?cc|subject|return-path|received|date|replied):" skip="^\z1\s" end="\v^\z1[!-9;-~]*([^!-~]|$)"me=s-1 end="\v^\z1@!"me=s-1 end="\v^\z1(\> ?)+"me=s-1 fold
35
Bram Moolenaarc1a11ed2008-06-24 22:09:24 +000036" Usenet headers
37syn match mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(Newsgroups|Followup-To|Message-ID|Supersedes|Control):.*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +000038
Bram Moolenaar071d4272004-06-13 20:20:40 +000039
Bram Moolenaar6bb68362005-03-22 23:03:44 +000040syn region mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@mailQuoteExps,@NoSpell start="\v(^(\> ?)*)@<=(to|b?cc):" skip=",$" end="$"
Bram Moolenaar5c736222010-01-06 20:54:52 +010041syn match mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(from|reply-to):.*$" fold
Bram Moolenaar75c50c42005-06-04 22:06:24 +000042syn match mailHeaderKey contained contains=@NoSpell "\v(^(\> ?)*)@<=date:"
Bram Moolenaar6be7f872012-01-20 21:08:56 +010043syn match mailSubject contained contains=@NoSpell "\v^subject:.*$" fold
Bram Moolenaar75c50c42005-06-04 22:06:24 +000044syn match mailSubject contained contains=@NoSpell "\v(^(\> ?)+)@<=subject:.*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +000045
46" Anything in the header between < and > is an email address
Bram Moolenaar75c50c42005-06-04 22:06:24 +000047syn match mailHeaderEmail contained contains=@NoSpell "<.\{-}>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000048
Bram Moolenaar4399ef42005-02-12 14:29:27 +000049" Mail Signatures. (Begin with "-- ", end with change in quote level)
Bram Moolenaar5c736222010-01-06 20:54:52 +010050syn region mailSignature keepend contains=@mailLinks,@mailQuoteExps start="^--\s$" end="^$" end="^\(> \?\)\+"me=s-1 fold
51syn region mailSignature keepend contains=@mailLinks,@mailQuoteExps,@NoSpell start="^\z(\(> \?\)\+\)--\s$" end="^\z1$" end="^\z1\@!"me=s-1 end="^\z1\(> \?\)\+"me=s-1 fold
52
53" Treat verbatim Text special.
54syn region mailVerbatim contains=@NoSpell keepend start="^#v+$" end="^#v-$" fold
55syn region mailVerbatim contains=@mailQuoteExps,@NoSpell start="^\z(\(> \?\)\+\)#v+$" end="\z1#v-$" fold
Bram Moolenaar071d4272004-06-13 20:20:40 +000056
57" URLs start with a known protocol or www,web,w3.
Bram Moolenaar75c50c42005-06-04 22:06:24 +000058syn match mailURL contains=@NoSpell `\v<(((https?|ftp|gopher)://|(mailto|file|news):)[^' <>"]+|(www|web|w3)[a-z0-9_-]*\.[a-z0-9._-]+\.[^' <>"]+)[a-z0-9/]`
59syn match mailEmail contains=@NoSpell "\v[_=a-z\./+0-9-]+\@[a-z0-9._-]+\a{2}"
Bram Moolenaar071d4272004-06-13 20:20:40 +000060
61" Make sure quote markers in regions (header / signature) have correct color
62syn match mailQuoteExp1 contained "\v^(\> ?)"
63syn match mailQuoteExp2 contained "\v^(\> ?){2}"
64syn match mailQuoteExp3 contained "\v^(\> ?){3}"
65syn match mailQuoteExp4 contained "\v^(\> ?){4}"
66syn match mailQuoteExp5 contained "\v^(\> ?){5}"
67syn match mailQuoteExp6 contained "\v^(\> ?){6}"
68
Bram Moolenaar5c736222010-01-06 20:54:52 +010069" Even and odd quoted lines. Order is important here!
70syn region mailQuoted6 keepend contains=mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{5}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold
71syn region mailQuoted5 keepend contains=mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{4}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold
72syn region mailQuoted4 keepend contains=mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{3}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold
73syn region mailQuoted3 keepend contains=mailQuoted4,mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{2}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold
74syn region mailQuoted2 keepend contains=mailQuoted3,mailQuoted4,mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{1}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold
75syn region mailQuoted1 keepend contains=mailQuoted2,mailQuoted3,mailQuoted4,mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z([a-z]\+>\|[]|}>]\)" end="^\z1\@!" fold
Bram Moolenaar071d4272004-06-13 20:20:40 +000076
77" Need to sync on the header. Assume we can do that within 100 lines
78if exists("mail_minlines")
79 exec "syn sync minlines=" . mail_minlines
80else
81 syn sync minlines=100
82endif
83
84" Define the default highlighting.
Bram Moolenaar5c736222010-01-06 20:54:52 +010085hi def link mailVerbatim Special
Bram Moolenaar071d4272004-06-13 20:20:40 +000086hi def link mailHeader Statement
87hi def link mailHeaderKey Type
88hi def link mailSignature PreProc
89hi def link mailHeaderEmail mailEmail
90hi def link mailEmail Special
91hi def link mailURL String
Bram Moolenaarf1568ec2011-12-14 21:17:39 +010092hi def link mailSubject Title
Bram Moolenaar071d4272004-06-13 20:20:40 +000093hi def link mailQuoted1 Comment
94hi def link mailQuoted3 mailQuoted1
95hi def link mailQuoted5 mailQuoted1
96hi def link mailQuoted2 Identifier
97hi def link mailQuoted4 mailQuoted2
98hi def link mailQuoted6 mailQuoted2
99hi def link mailQuoteExp1 mailQuoted1
100hi def link mailQuoteExp2 mailQuoted2
101hi def link mailQuoteExp3 mailQuoted3
102hi def link mailQuoteExp4 mailQuoted4
103hi def link mailQuoteExp5 mailQuoted5
104hi def link mailQuoteExp6 mailQuoted6
105
106let b:current_syntax = "mail"