1" Vim syntax file 2" Language: Markdown 3" Maintainer: Tim Pope <[email protected]> 4" Filenames: *.markdown 5" Last Change: 2013 May 30 6 7if exists("b:current_syntax") 8 finish 9endif 10 11if !exists('main_syntax') 12 let main_syntax = 'markdown' 13endif 14 15runtime! syntax/html.vim 16unlet! b:current_syntax 17 18if !exists('g:markdown_fenced_languages') 19 let g:markdown_fenced_languages = [] 20endif 21for s:type in map(copy(g:markdown_fenced_languages),'matchstr(v:val,"[^=]*$")') 22 if s:type =~ '\.' 23 let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*') 24 endif 25 exe 'syn include @markdownHighlight'.substitute(s:type,'\.','','g').' syntax/'.matchstr(s:type,'[^.]*').'.vim' 26 unlet! b:current_syntax 27endfor 28unlet! s:type 29 30syn sync minlines=10 31syn case ignore 32 33syn match markdownValid '[<>]\c[a-z/$!]\@!' 34syn match markdownValid '&\%(#\=\w*;\)\@!' 35 36syn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock,htmlSpecialChar 37 38syn cluster markdownBlock contains=markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6,markdownBlockquote,markdownListMarker,markdownOrderedListMarker,markdownCodeBlock,markdownRule 39syn cluster markdownInline contains=markdownLineBreak,markdownLinkText,markdownItalic,markdownBold,markdownCode,markdownEscape,@htmlTop,markdownError 40 41syn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink 42syn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink 43 44syn match markdownHeadingRule "^[=-]\+$" contained 45 46syn region markdownH1 matchgroup=markdownHeadingDelimiter start="##\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 47syn region markdownH2 matchgroup=markdownHeadingDelimiter start="###\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 48syn region markdownH3 matchgroup=markdownHeadingDelimiter start="####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 49syn region markdownH4 matchgroup=markdownHeadingDelimiter start="#####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 50syn region markdownH5 matchgroup=markdownHeadingDelimiter start="######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 51syn region markdownH6 matchgroup=markdownHeadingDelimiter start="#######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 52 53syn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock 54 55syn region markdownCodeBlock start=" \|\t" end="$" contained 56 57" TODO: real nesting 58syn match markdownListMarker "\%(\t\| \{0,4\}\)[-*+]\%(\s\+\S\)\@=" contained 59syn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s\+\S\)\@=" contained 60 61syn match markdownRule "\* *\* *\*[ *]*$" contained 62syn match markdownRule "- *- *-[ -]*$" contained 63 64syn match markdownLineBreak " \{2,\}$" 65 66syn region markdownIdDeclaration matchgroup=markdownLinkDelimiter start="^ \{0,3\}!\=\[" end="\]:" oneline keepend nextgroup=markdownUrl skipwhite 67syn match markdownUrl "\S\+" nextgroup=markdownUrlTitle skipwhite contained 68syn region markdownUrl matchgroup=markdownUrlDelimiter start="<" end=">" oneline keepend nextgroup=markdownUrlTitle skipwhite contained 69syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+"+ end=+"+ keepend contained 70syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+'+ end=+'+ keepend contained 71syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+(+ end=+)+ keepend contained 72 73syn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\_[^]]*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" keepend nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart 74syn region markdownLink matchgroup=markdownLinkDelimiter start="(" end=")" contains=markdownUrl keepend contained 75syn region markdownId matchgroup=markdownIdDelimiter start="\[" end="\]" keepend contained 76syn region markdownAutomaticLink matchgroup=markdownUrlDelimiter start="<\%(\w\+:\|[[:alnum:]_+-]\+@\)\@=" end=">" keepend oneline 77 78syn region markdownItalic start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" keepend contains=markdownLineStart 79syn region markdownItalic start="\S\@<=_\|_\S\@=" end="\S\@<=_\|_\S\@=" keepend contains=markdownLineStart 80syn region markdownBold start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" keepend contains=markdownLineStart,markdownItalic 81syn region markdownBold start="\S\@<=__\|__\S\@=" end="\S\@<=__\|__\S\@=" keepend contains=markdownLineStart,markdownItalic 82syn region markdownBoldItalic start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" keepend contains=markdownLineStart 83syn region markdownBoldItalic start="\S\@<=___\|___\S\@=" end="\S\@<=___\|___\S\@=" keepend contains=markdownLineStart 84syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart 85syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart 86syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*```.*$" end="^\s*```\ze\s*$" keepend 87 88if main_syntax ==# 'markdown' 89 for s:type in g:markdown_fenced_languages 90 exe 'syn region markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*```'.matchstr(s:type,'[^=]*').'\>.*$" end="^\s*```\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g') 91 endfor 92 unlet! s:type 93endif 94 95syn match markdownEscape "\\[][\\`*_{}()#+.!-]" 96syn match markdownError "\w\@<=_\w\@=" 97 98hi def link markdownH1 htmlH1 99hi def link markdownH2 htmlH2 100hi def link markdownH3 htmlH3 101hi def link markdownH4 htmlH4 102hi def link markdownH5 htmlH5 103hi def link markdownH6 htmlH6 104hi def link markdownHeadingRule markdownRule 105hi def link markdownHeadingDelimiter Delimiter 106hi def link markdownOrderedListMarker markdownListMarker 107hi def link markdownListMarker htmlTagName 108hi def link markdownBlockquote Comment 109hi def link markdownRule PreProc 110 111hi def link markdownLinkText htmlLink 112hi def link markdownIdDeclaration Typedef 113hi def link markdownId Type 114hi def link markdownAutomaticLink markdownUrl 115hi def link markdownUrl Float 116hi def link markdownUrlTitle String 117hi def link markdownIdDelimiter markdownLinkDelimiter 118hi def link markdownUrlDelimiter htmlTag 119hi def link markdownUrlTitleDelimiter Delimiter 120 121hi def link markdownItalic htmlItalic 122hi def link markdownBold htmlBold 123hi def link markdownBoldItalic htmlBoldItalic 124hi def link markdownCodeDelimiter Delimiter 125 126hi def link markdownEscape Special 127hi def link markdownError Error 128 129let b:current_syntax = "markdown" 130if main_syntax ==# 'markdown' 131 unlet main_syntax 132endif 133 134" vim:set sw=2: 135