comparison runtime/syntax/mail.vim @ 0:76efa0be13f1

Initial revision
author atsuki
date Sat, 10 Nov 2007 15:07:22 +0900
parents
children e170173ecb68
comparison
equal deleted inserted replaced
-1:000000000000 0:76efa0be13f1
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
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
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.*$"
29
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
34
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:.*$"
40
41 " Anything in the header between < and > is an email address
42 syn match mailHeaderEmail contained contains=@NoSpell "<.\{-}>"
43
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
47
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}"
51
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}"
59
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}.*$"
67
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
74
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
95
96 let b:current_syntax = "mail"