7
|
1 " Vim syntax file
|
|
2 " Language: Mail file
|
|
3 " Previous Maintainer: Felix von Leitner <leitner@math.fu-berlin.de>
|
1622
|
4 " Maintainer: Gautam Iyer <gi1242@users.sourceforge.net>
|
|
5 " Last Change: Thu 17 Jan 2008 11:25:44 AM PST
|
7
|
6
|
|
7 " Quit when a syntax file was already loaded
|
|
8 if exists("b:current_syntax")
|
|
9 finish
|
|
10 endif
|
|
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
|
|
18 syn cluster mailHeaderFields contains=mailHeaderKey,mailSubject,mailHeaderEmail,@mailLinks
|
|
19 syn cluster mailLinks contains=mailURL,mailEmail
|
|
20 syn cluster mailQuoteExps contains=mailQuoteExp1,mailQuoteExp2,mailQuoteExp3,mailQuoteExp4,mailQuoteExp5,mailQuoteExp6
|
|
21
|
|
22 syn case match
|
|
23 " For "From " matching case is required. The "From " is not matched in quoted
|
|
24 " emails
|
1125
|
25 " According to RFC 2822 any printable ASCII character can appear in a field
|
|
26 " name, except ':'.
|
1622
|
27 syn region mailHeader contains=@mailHeaderFields,@NoSpell start="^From .*\d\d\d\d$" skip="^\s" end="\v^[!-9;-~]*([^!-~]|$)"me=s-1
|
|
28 syn match mailHeaderKey contained contains=mailEmail,@NoSpell "^From\s.*\d\d\d\d$"
|
|
29 " Usenet headers
|
|
30 syn match mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(Newsgroups|Followup-To|Message-ID|Supersedes|Control):.*$"
|
7
|
31
|
|
32 syn case ignore
|
|
33 " Nothing else depends on case. Headers in properly quoted (with "> " or ">")
|
|
34 " emails are matched
|
1622
|
35 syn 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
|
7
|
36
|
227
|
37 syn region mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@mailQuoteExps,@NoSpell start="\v(^(\> ?)*)@<=(to|b?cc):" skip=",$" end="$"
|
|
38 syn match mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(from|reply-to):.*$"
|
301
|
39 syn match mailHeaderKey contained contains=@NoSpell "\v(^(\> ?)*)@<=date:"
|
|
40 syn match mailSubject contained "\v^subject:.*$"
|
|
41 syn match mailSubject contained contains=@NoSpell "\v(^(\> ?)+)@<=subject:.*$"
|
7
|
42
|
|
43 " Anything in the header between < and > is an email address
|
301
|
44 syn match mailHeaderEmail contained contains=@NoSpell "<.\{-}>"
|
7
|
45
|
164
|
46 " Mail Signatures. (Begin with "-- ", end with change in quote level)
|
301
|
47 syn region mailSignature keepend contains=@mailLinks,@mailQuoteExps start="^--\s$" end="^$" end="^\(> \?\)\+"me=s-1
|
|
48 syn region mailSignature keepend contains=@mailLinks,@mailQuoteExps,@NoSpell start="^\z(\(> \?\)\+\)--\s$" end="^\z1$" end="^\z1\@!"me=s-1 end="^\z1\(> \?\)\+"me=s-1
|
7
|
49
|
|
50 " URLs start with a known protocol or www,web,w3.
|
301
|
51 syn match mailURL contains=@NoSpell `\v<(((https?|ftp|gopher)://|(mailto|file|news):)[^' <>"]+|(www|web|w3)[a-z0-9_-]*\.[a-z0-9._-]+\.[^' <>"]+)[a-z0-9/]`
|
|
52 syn match mailEmail contains=@NoSpell "\v[_=a-z\./+0-9-]+\@[a-z0-9._-]+\a{2}"
|
7
|
53
|
|
54 " Make sure quote markers in regions (header / signature) have correct color
|
|
55 syn match mailQuoteExp1 contained "\v^(\> ?)"
|
|
56 syn match mailQuoteExp2 contained "\v^(\> ?){2}"
|
|
57 syn match mailQuoteExp3 contained "\v^(\> ?){3}"
|
|
58 syn match mailQuoteExp4 contained "\v^(\> ?){4}"
|
|
59 syn match mailQuoteExp5 contained "\v^(\> ?){5}"
|
|
60 syn match mailQuoteExp6 contained "\v^(\> ?){6}"
|
|
61
|
|
62 " Even and odd quoted lines. order is imporant here!
|
301
|
63 syn match mailQuoted1 contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\([a-z]\+>\|[]|}>]\).*$"
|
|
64 syn match mailQuoted2 contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{2}.*$"
|
|
65 syn match mailQuoted3 contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{3}.*$"
|
|
66 syn match mailQuoted4 contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{4}.*$"
|
|
67 syn match mailQuoted5 contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{5}.*$"
|
|
68 syn match mailQuoted6 contains=mailHeader,@mailLinks,mailSignature,@NoSpell "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{6}.*$"
|
7
|
69
|
|
70 " Need to sync on the header. Assume we can do that within 100 lines
|
|
71 if exists("mail_minlines")
|
|
72 exec "syn sync minlines=" . mail_minlines
|
|
73 else
|
|
74 syn sync minlines=100
|
|
75 endif
|
|
76
|
|
77 " Define the default highlighting.
|
|
78 hi def link mailHeader Statement
|
|
79 hi def link mailHeaderKey Type
|
|
80 hi def link mailSignature PreProc
|
|
81 hi def link mailHeaderEmail mailEmail
|
|
82 hi def link mailEmail Special
|
|
83 hi def link mailURL String
|
|
84 hi def link mailSubject LineNR
|
|
85 hi def link mailQuoted1 Comment
|
|
86 hi def link mailQuoted3 mailQuoted1
|
|
87 hi def link mailQuoted5 mailQuoted1
|
|
88 hi def link mailQuoted2 Identifier
|
|
89 hi def link mailQuoted4 mailQuoted2
|
|
90 hi def link mailQuoted6 mailQuoted2
|
|
91 hi def link mailQuoteExp1 mailQuoted1
|
|
92 hi def link mailQuoteExp2 mailQuoted2
|
|
93 hi def link mailQuoteExp3 mailQuoted3
|
|
94 hi def link mailQuoteExp4 mailQuoted4
|
|
95 hi def link mailQuoteExp5 mailQuoted5
|
|
96 hi def link mailQuoteExp6 mailQuoted6
|
|
97
|
|
98 let b:current_syntax = "mail"
|