Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1 | " Vim syntax file |
| 2 | " Language: Mail file |
| 3 | " Previous Maintainer: Felix von Leitner <leitner@math.fu-berlin.de> |
Bram Moolenaar | f1568ec | 2011-12-14 21:17:39 +0100 | [diff] [blame] | 4 | " Maintainer: GI <a@b.c>, where a='gi1242+vim', b='gmail', c='com' |
gi1242 | 046a0f7 | 2024-01-25 13:52:47 -0500 | [diff] [blame] | 5 | " Last Change: Thu 25 Jan 2024 10:34:02 AM EST |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 6 | |
| 7 | " Quit when a syntax file was already loaded |
| 8 | if exists("b:current_syntax") |
| 9 | finish |
| 10 | endif |
| 11 | |
Bram Moolenaar | b8ff1fb | 2012-02-04 21:59:01 +0100 | [diff] [blame] | 12 | let s:cpo_save = &cpo |
| 13 | set cpo&vim |
| 14 | |
GI | 36e2c0f | 2024-01-23 19:46:30 +0100 | [diff] [blame] | 15 | syn spell toplevel |
| 16 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 17 | " The mail header is recognized starting with a "keyword:" line and ending |
| 18 | " with an empty line or other line that can't be in the header. All lines of |
| 19 | " the header are highlighted. Headers of quoted messages (quoted with >) are |
| 20 | " also highlighted. |
| 21 | |
| 22 | " Syntax clusters |
| 23 | syn cluster mailHeaderFields contains=mailHeaderKey,mailSubject,mailHeaderEmail,@mailLinks |
| 24 | syn cluster mailLinks contains=mailURL,mailEmail |
| 25 | syn cluster mailQuoteExps contains=mailQuoteExp1,mailQuoteExp2,mailQuoteExp3,mailQuoteExp4,mailQuoteExp5,mailQuoteExp6 |
| 26 | |
| 27 | syn case match |
| 28 | " For "From " matching case is required. The "From " is not matched in quoted |
| 29 | " emails |
Bram Moolenaar | c81e5e7 | 2007-05-05 18:24:42 +0000 | [diff] [blame] | 30 | " According to RFC 2822 any printable ASCII character can appear in a field |
| 31 | " name, except ':'. |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 32 | syn region mailHeader contains=@mailHeaderFields,@NoSpell start="^From .*\d\d\d\d$" skip="^\s" end="\v^[!-9;-~]*([^!-~]|$)"me=s-1 fold |
Bram Moolenaar | c1a11ed | 2008-06-24 22:09:24 +0000 | [diff] [blame] | 33 | syn match mailHeaderKey contained contains=mailEmail,@NoSpell "^From\s.*\d\d\d\d$" |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 34 | |
| 35 | " Nothing else depends on case. |
| 36 | syn case ignore |
| 37 | |
| 38 | " Headers in properly quoted (with "> " or ">") emails are matched |
| 39 | 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 fold |
| 40 | |
Bram Moolenaar | c1a11ed | 2008-06-24 22:09:24 +0000 | [diff] [blame] | 41 | " Usenet headers |
| 42 | syn match mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(Newsgroups|Followup-To|Message-ID|Supersedes|Control):.*$" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 43 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 44 | |
Bram Moolenaar | 6bb6836 | 2005-03-22 23:03:44 +0000 | [diff] [blame] | 45 | syn region mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@mailQuoteExps,@NoSpell start="\v(^(\> ?)*)@<=(to|b?cc):" skip=",$" end="$" |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 46 | syn match mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(from|reply-to):.*$" fold |
Bram Moolenaar | 75c50c4 | 2005-06-04 22:06:24 +0000 | [diff] [blame] | 47 | syn match mailHeaderKey contained contains=@NoSpell "\v(^(\> ?)*)@<=date:" |
Bram Moolenaar | b8ff1fb | 2012-02-04 21:59:01 +0100 | [diff] [blame] | 48 | syn match mailSubject contained "\v^subject:.*$" fold |
Bram Moolenaar | 75c50c4 | 2005-06-04 22:06:24 +0000 | [diff] [blame] | 49 | syn match mailSubject contained contains=@NoSpell "\v(^(\> ?)+)@<=subject:.*$" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 50 | |
| 51 | " Anything in the header between < and > is an email address |
Bram Moolenaar | 75c50c4 | 2005-06-04 22:06:24 +0000 | [diff] [blame] | 52 | syn match mailHeaderEmail contained contains=@NoSpell "<.\{-}>" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 53 | |
Bram Moolenaar | 4399ef4 | 2005-02-12 14:29:27 +0000 | [diff] [blame] | 54 | " Mail Signatures. (Begin with "-- ", end with change in quote level) |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 55 | syn region mailSignature keepend contains=@mailLinks,@mailQuoteExps start="^--\s$" end="^$" end="^\(> \?\)\+"me=s-1 fold |
| 56 | syn region mailSignature keepend contains=@mailLinks,@mailQuoteExps,@NoSpell start="^\z(\(> \?\)\+\)--\s$" end="^\z1$" end="^\z1\@!"me=s-1 end="^\z1\(> \?\)\+"me=s-1 fold |
| 57 | |
| 58 | " Treat verbatim Text special. |
| 59 | syn region mailVerbatim contains=@NoSpell keepend start="^#v+$" end="^#v-$" fold |
Bram Moolenaar | 7cba6c0 | 2013-09-05 22:13:31 +0200 | [diff] [blame] | 60 | syn region mailVerbatim contains=@mailQuoteExps,@NoSpell keepend start="^\z(\(> \?\)\+\)#v+$" end="\z1#v-$" fold |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 61 | |
| 62 | " URLs start with a known protocol or www,web,w3. |
Bram Moolenaar | 75c50c4 | 2005-06-04 22:06:24 +0000 | [diff] [blame] | 63 | syn match mailURL contains=@NoSpell `\v<(((https?|ftp|gopher)://|(mailto|file|news):)[^' <>"]+|(www|web|w3)[a-z0-9_-]*\.[a-z0-9._-]+\.[^' <>"]+)[a-z0-9/]` |
| 64 | syn match mailEmail contains=@NoSpell "\v[_=a-z\./+0-9-]+\@[a-z0-9._-]+\a{2}" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 65 | |
GI | 36e2c0f | 2024-01-23 19:46:30 +0100 | [diff] [blame] | 66 | " Don't spell emojis |
gi1242 | 046a0f7 | 2024-01-25 13:52:47 -0500 | [diff] [blame] | 67 | syn match mailEmoji contains=@NoSpell "\%#=2\v[\U1f300-\U1f64f\U1f900-\U1f9ff]" |
GI | 36e2c0f | 2024-01-23 19:46:30 +0100 | [diff] [blame] | 68 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 69 | " Make sure quote markers in regions (header / signature) have correct color |
| 70 | syn match mailQuoteExp1 contained "\v^(\> ?)" |
| 71 | syn match mailQuoteExp2 contained "\v^(\> ?){2}" |
| 72 | syn match mailQuoteExp3 contained "\v^(\> ?){3}" |
| 73 | syn match mailQuoteExp4 contained "\v^(\> ?){4}" |
| 74 | syn match mailQuoteExp5 contained "\v^(\> ?){5}" |
| 75 | syn match mailQuoteExp6 contained "\v^(\> ?){6}" |
| 76 | |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 77 | " Even and odd quoted lines. Order is important here! |
| 78 | syn region mailQuoted6 keepend contains=mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{5}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold |
| 79 | syn region mailQuoted5 keepend contains=mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{4}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold |
| 80 | syn region mailQuoted4 keepend contains=mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{3}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold |
| 81 | syn region mailQuoted3 keepend contains=mailQuoted4,mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{2}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold |
| 82 | syn region mailQuoted2 keepend contains=mailQuoted3,mailQuoted4,mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{1}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold |
| 83 | syn region mailQuoted1 keepend contains=mailQuoted2,mailQuoted3,mailQuoted4,mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z([a-z]\+>\|[]|}>]\)" end="^\z1\@!" fold |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 84 | |
| 85 | " Need to sync on the header. Assume we can do that within 100 lines |
| 86 | if exists("mail_minlines") |
| 87 | exec "syn sync minlines=" . mail_minlines |
| 88 | else |
| 89 | syn sync minlines=100 |
| 90 | endif |
| 91 | |
| 92 | " Define the default highlighting. |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 93 | hi def link mailVerbatim Special |
GI | 36e2c0f | 2024-01-23 19:46:30 +0100 | [diff] [blame] | 94 | hi def link mailHeader PreProc |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 95 | hi def link mailHeaderKey Type |
GI | 36e2c0f | 2024-01-23 19:46:30 +0100 | [diff] [blame] | 96 | hi def link mailSignature Comment |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 97 | hi def link mailHeaderEmail mailEmail |
GI | 36e2c0f | 2024-01-23 19:46:30 +0100 | [diff] [blame] | 98 | hi def link mailEmail String |
| 99 | hi def link mailURL Constant |
| 100 | hi def link mailSubject Statement |
| 101 | hi def link mailQuoted1 Function |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 102 | hi def link mailQuoted3 mailQuoted1 |
| 103 | hi def link mailQuoted5 mailQuoted1 |
| 104 | hi def link mailQuoted2 Identifier |
| 105 | hi def link mailQuoted4 mailQuoted2 |
| 106 | hi def link mailQuoted6 mailQuoted2 |
| 107 | hi def link mailQuoteExp1 mailQuoted1 |
| 108 | hi def link mailQuoteExp2 mailQuoted2 |
| 109 | hi def link mailQuoteExp3 mailQuoted3 |
| 110 | hi def link mailQuoteExp4 mailQuoted4 |
| 111 | hi def link mailQuoteExp5 mailQuoted5 |
| 112 | hi def link mailQuoteExp6 mailQuoted6 |
| 113 | |
| 114 | let b:current_syntax = "mail" |
Bram Moolenaar | b8ff1fb | 2012-02-04 21:59:01 +0100 | [diff] [blame] | 115 | |
| 116 | let &cpo = s:cpo_save |
| 117 | unlet s:cpo_save |