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