Runtime files update
[MacVim.git] / runtime / syntax / mail.vim
blob1157517f8b7863f32414e2370b3b811583c4153a
1 " Vim syntax file
2 " Language:             Mail file
3 " Previous Maintainer:  Felix von Leitner <leitner@math.fu-berlin.de>
4 " Maintainer:           Gautam Iyer <gi1242@users.sourceforge.net>
5 " Last Change:          Thu 17 Jan 2008 11:25:44 AM PST
7 " Quit when a syntax file was already loaded
8 if exists("b:current_syntax")
9   finish
10 endif
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.
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
22 syn case match
23 " For "From " matching case is required. The "From " is not matched in quoted
24 " emails
25 " According to RFC 2822 any printable ASCII character can appear in a field
26 " name, except ':'.
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):.*$"
32 syn case ignore
33 " Nothing else depends on case. Headers in properly quoted (with "> " or ">")
34 " emails are matched
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
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):.*$"
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:.*$"
43 " Anything in the header between < and > is an email address
44 syn match       mailHeaderEmail contained contains=@NoSpell "<.\{-}>"
46 " Mail Signatures. (Begin with "-- ", end with change in quote level)
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
50 " URLs start with a known protocol or www,web,w3.
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}"
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}"
62 " Even and odd quoted lines. order is imporant here!
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}.*$"
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
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
98 let b:current_syntax = "mail"