xref: /vim-8.2.3635/runtime/syntax/mail.vim (revision 0fa313a7)
1" Vim syntax file
2" Language:		Mail file
3" Previous Maintainer:	Felix von Leitner <[email protected]>
4" Maintainer:		Gautam Iyer <[email protected]>
5" Last Change:		Wed 01 Jun 2005 02:11:07 PM CDT
6
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
25syn region	mailHeader	contains=@mailHeaderFields,@NoSpell start="^From " skip="^\s" end="\v^[-A-Za-z0-9]*([^-A-Za-z0-9:]|$)"me=s-1
26syn match	mailHeaderKey	contained contains=mailEmail,@NoSpell "^From\s.*$"
27
28syn case ignore
29" Nothing else depends on case. Headers in properly quoted (with "> " or ">")
30" emails are matched
31syn region	mailHeader	keepend contains=@mailHeaderFields,@mailQuoteExps,@NoSpell start="^\z(\(> \?\)*\)\v(newsgroups|from|((in-)?reply-)?to|b?cc|subject|return-path|received|date|replied):" skip="^\z1\s" end="\v^\z1[-a-z0-9]*([^-a-z0-9:]|$)"me=s-1 end="\v^\z1@!"me=s-1 end="\v^\z1(\> ?)+"me=s-1
32
33syn region	mailHeaderKey	contained contains=mailHeaderEmail,mailEmail,@mailQuoteExps,@NoSpell start="\v(^(\> ?)*)@<=(to|b?cc):" skip=",$" end="$"
34syn match	mailHeaderKey	contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(from|reply-to):.*$"
35syn match	mailHeaderKey	contained contains=@NoSpell "\v(^(\> ?)*)@<=date:"
36syn match	mailSubject	contained "\v^subject:.*$"
37syn match	mailSubject	contained contains=@NoSpell "\v(^(\> ?)+)@<=subject:.*$"
38
39" Anything in the header between < and > is an email address
40syn match	mailHeaderEmail	contained contains=@NoSpell "<.\{-}>"
41
42" Mail Signatures. (Begin with "-- ", end with change in quote level)
43syn region	mailSignature	keepend contains=@mailLinks,@mailQuoteExps start="^--\s$" end="^$" end="^\(> \?\)\+"me=s-1
44syn region	mailSignature	keepend contains=@mailLinks,@mailQuoteExps,@NoSpell start="^\z(\(> \?\)\+\)--\s$" end="^\z1$" end="^\z1\@!"me=s-1 end="^\z1\(> \?\)\+"me=s-1
45
46" URLs start with a known protocol or www,web,w3.
47syn match mailURL contains=@NoSpell `\v<(((https?|ftp|gopher)://|(mailto|file|news):)[^' 	<>"]+|(www|web|w3)[a-z0-9_-]*\.[a-z0-9._-]+\.[^' 	<>"]+)[a-z0-9/]`
48syn match mailEmail contains=@NoSpell "\v[_=a-z\./+0-9-]+\@[a-z0-9._-]+\a{2}"
49
50" Make sure quote markers in regions (header / signature) have correct color
51syn match mailQuoteExp1	contained "\v^(\> ?)"
52syn match mailQuoteExp2	contained "\v^(\> ?){2}"
53syn match mailQuoteExp3	contained "\v^(\> ?){3}"
54syn match mailQuoteExp4	contained "\v^(\> ?){4}"
55syn match mailQuoteExp5	contained "\v^(\> ?){5}"
56syn match mailQuoteExp6	contained "\v^(\> ?){6}"
57
58" Even and odd quoted lines. order is imporant here!
59syn match mailQuoted1	contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\([a-z]\+>\|[]|}>]\).*$"
60syn match mailQuoted2	contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{2}.*$"
61syn match mailQuoted3	contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{3}.*$"
62syn match mailQuoted4	contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{4}.*$"
63syn match mailQuoted5	contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{5}.*$"
64syn match mailQuoted6	contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{6}.*$"
65
66" Need to sync on the header. Assume we can do that within 100 lines
67if exists("mail_minlines")
68    exec "syn sync minlines=" . mail_minlines
69else
70    syn sync minlines=100
71endif
72
73" Define the default highlighting.
74hi def link mailHeader		Statement
75hi def link mailHeaderKey	Type
76hi def link mailSignature	PreProc
77hi def link mailHeaderEmail	mailEmail
78hi def link mailEmail		Special
79hi def link mailURL		String
80hi def link mailSubject		LineNR
81hi def link mailQuoted1		Comment
82hi def link mailQuoted3		mailQuoted1
83hi def link mailQuoted5		mailQuoted1
84hi def link mailQuoted2		Identifier
85hi def link mailQuoted4		mailQuoted2
86hi def link mailQuoted6		mailQuoted2
87hi def link mailQuoteExp1	mailQuoted1
88hi def link mailQuoteExp2	mailQuoted2
89hi def link mailQuoteExp3	mailQuoted3
90hi def link mailQuoteExp4	mailQuoted4
91hi def link mailQuoteExp5	mailQuoted5
92hi def link mailQuoteExp6	mailQuoted6
93
94let b:current_syntax = "mail"
95