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: Mon 23 Feb 2004 02:26:16 PM CST 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 start="^From " skip="^\s" end="\v^[-A-Za-z0-9]*([^-A-Za-z0-9:]|$)"me=s-1 26syn match mailHeaderKey contained contains=mailEmail "^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 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 start="\v(^(\> ?)*)@<=(to|b?cc):" skip=",$" end="$" 34syn match mailHeaderKey contained contains=mailHeaderEmail,mailEmail "\v(^(\> ?)*)@<=(from|reply-to):.*$" 35syn match mailHeaderKey contained "\v(^(\> ?)*)@<=date:" 36syn match mailSubject contained "\v(^(\> ?)*)@<=subject:.*$" contains=@Spell 37 38" Anything in the header between < and > is an email address 39syn match mailHeaderEmail contained "<.\{-}>" 40 41" Mail Signatures. (Begin with "--", end with change in quote level) 42syn region mailSignature keepend contains=@mailLinks,@mailQuoteExps start="^\z(\(> \?\)*\)-- *$" end="^\z1$" end="^\z1\@!"me=s-1 end="^\z1\(> \?\)\+"me=s-1 43 44" URLs start with a known protocol or www,web,w3. 45syn match mailURL `\v<(((https?|ftp|gopher)://|(mailto|file|news):)[^' <>"]+|(www|web|w3)[a-z0-9_-]*\.[a-z0-9._-]+\.[^' <>"]+)[a-z0-9/]` 46syn match mailEmail "\v[_=a-z\./+0-9-]+\@[a-z0-9._-]+\a{2}" 47 48" Make sure quote markers in regions (header / signature) have correct color 49syn match mailQuoteExp1 contained "\v^(\> ?)" 50syn match mailQuoteExp2 contained "\v^(\> ?){2}" 51syn match mailQuoteExp3 contained "\v^(\> ?){3}" 52syn match mailQuoteExp4 contained "\v^(\> ?){4}" 53syn match mailQuoteExp5 contained "\v^(\> ?){5}" 54syn match mailQuoteExp6 contained "\v^(\> ?){6}" 55 56" Even and odd quoted lines. order is imporant here! 57syn match mailQuoted1 contains=mailHeader,@mailLinks,mailSignature "^\([a-z]\+>\|[]|}>]\).*$" 58syn match mailQuoted2 contains=mailHeader,@mailLinks,mailSignature "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{2}.*$" 59syn match mailQuoted3 contains=mailHeader,@mailLinks,mailSignature "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{3}.*$" 60syn match mailQuoted4 contains=mailHeader,@mailLinks,mailSignature "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{4}.*$" 61syn match mailQuoted5 contains=mailHeader,@mailLinks,mailSignature "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{5}.*$" 62syn match mailQuoted6 contains=mailHeader,@mailLinks,mailSignature "^\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{6}.*$" 63 64" Need to sync on the header. Assume we can do that within 100 lines 65if exists("mail_minlines") 66 exec "syn sync minlines=" . mail_minlines 67else 68 syn sync minlines=100 69endif 70 71" Define the default highlighting. 72hi def link mailHeader Statement 73hi def link mailHeaderKey Type 74hi def link mailSignature PreProc 75hi def link mailHeaderEmail mailEmail 76hi def link mailEmail Special 77hi def link mailURL String 78hi def link mailSubject LineNR 79hi def link mailQuoted1 Comment 80hi def link mailQuoted3 mailQuoted1 81hi def link mailQuoted5 mailQuoted1 82hi def link mailQuoted2 Identifier 83hi def link mailQuoted4 mailQuoted2 84hi def link mailQuoted6 mailQuoted2 85hi def link mailQuoteExp1 mailQuoted1 86hi def link mailQuoteExp2 mailQuoted2 87hi def link mailQuoteExp3 mailQuoted3 88hi def link mailQuoteExp4 mailQuoted4 89hi def link mailQuoteExp5 mailQuoted5 90hi def link mailQuoteExp6 mailQuoted6 91 92let b:current_syntax = "mail" 93