neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

mail.vim (6195B)


      1 " Vim syntax file
      2 " Language:		Mail file
      3 " Previous Maintainer:	Felix von Leitner <leitner@math.fu-berlin.de>
      4 " Maintainer:		GI <a@b.c>, where a='gi1242+vim', b='gmail', c='com'
      5 " Last Change:		Thu 25 Jan 2024 10:34:02 AM EST
      6 
      7 " Quit when a syntax file was already loaded
      8 if exists("b:current_syntax")
      9  finish
     10 endif
     11 
     12 let s:cpo_save = &cpo
     13 set cpo&vim
     14 
     15 syn spell toplevel
     16 
     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
     30 " According to RFC 2822 any printable ASCII character can appear in a field
     31 " name, except ':'.
     32 syn region	mailHeader	contains=@mailHeaderFields,@NoSpell start="^From .*\d\d\d\d$" skip="^\s" end="\v^[!-9;-~]*([^!-~]|$)"me=s-1 fold
     33 syn match	mailHeaderKey	contained contains=mailEmail,@NoSpell "^From\s.*\d\d\d\d$"
     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 
     41 " Usenet headers
     42 syn match	mailHeaderKey	contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(Newsgroups|Followup-To|Message-ID|Supersedes|Control):.*$"
     43 
     44 
     45 syn region	mailHeaderKey	contained contains=mailHeaderEmail,mailEmail,@mailQuoteExps,@NoSpell start="\v(^(\> ?)*)@<=(to|b?cc):" skip=",$" end="$"
     46 syn match	mailHeaderKey	contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(from|reply-to):.*$" fold
     47 syn match	mailHeaderKey	contained contains=@NoSpell "\v(^(\> ?)*)@<=date:"
     48 syn match	mailSubject	contained "\v^subject:.*$" fold
     49 syn match	mailSubject	contained contains=@NoSpell "\v(^(\> ?)+)@<=subject:.*$"
     50 
     51 " Anything in the header between < and > is an email address
     52 syn match	mailHeaderEmail	contained contains=@NoSpell "<.\{-}>"
     53 
     54 " Mail Signatures. (Begin with "-- ", end with change in quote level)
     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 
     60 syn region	mailVerbatim	contains=@mailQuoteExps,@NoSpell keepend start="^\z(\(> \?\)\+\)#v+$" end="\z1#v-$" fold 
     61 
     62 " URLs start with a known protocol or www,web,w3.
     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}"
     65 
     66 " Don't spell emojis
     67 syn match mailEmoji contains=@NoSpell "\%#=2\v[\U1f300-\U1f64f\U1f900-\U1f9ff]"
     68 
     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 
     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
     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.
     93 hi def link mailVerbatim	Special
     94 hi def link mailHeader		PreProc
     95 hi def link mailHeaderKey	Type
     96 hi def link mailSignature	Comment
     97 hi def link mailHeaderEmail	mailEmail
     98 hi def link mailEmail		String
     99 hi def link mailURL		Constant
    100 hi def link mailSubject		Statement
    101 hi def link mailQuoted1		Function
    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"
    115 
    116 let &cpo = s:cpo_save
    117 unlet s:cpo_save