1" Vim syntax file 2" Language: Markdown 3" Maintainer: Tim Pope <[email protected]> 4" Filenames: *.markdown 5" Last Change: 2016 Aug 29 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="\]\%( \=[[(]\)\@=" 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 78let s:concealends = has('conceal') ? ' concealends' : '' 79exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" keepend contains=markdownLineStart' . s:concealends 80exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\S\@<=_\|_\S\@=" end="\S\@<=_\|_\S\@=" keepend contains=markdownLineStart' . s:concealends 81exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" keepend contains=markdownLineStart,markdownItalic' . s:concealends 82exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\S\@<=__\|__\S\@=" end="\S\@<=__\|__\S\@=" keepend contains=markdownLineStart,markdownItalic' . s:concealends 83exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" keepend contains=markdownLineStart' . s:concealends 84exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\S\@<=___\|___\S\@=" end="\S\@<=___\|___\S\@=" keepend contains=markdownLineStart' . s:concealends 85 86syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart 87syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart 88syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*```.*$" end="^\s*```\ze\s*$" keepend 89 90syn match markdownFootnote "\[^[^\]]\+\]" 91syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:" 92 93if main_syntax ==# 'markdown' 94 for s:type in g:markdown_fenced_languages 95 exe 'syn region markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*```\s*'.matchstr(s:type,'[^=]*').'\>.*$" end="^\s*```\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g') 96 endfor 97 unlet! s:type 98endif 99 100syn match markdownEscape "\\[][\\`*_{}()<>#+.!-]" 101syn match markdownError "\w\@<=_\w\@=" 102 103hi def link markdownH1 htmlH1 104hi def link markdownH2 htmlH2 105hi def link markdownH3 htmlH3 106hi def link markdownH4 htmlH4 107hi def link markdownH5 htmlH5 108hi def link markdownH6 htmlH6 109hi def link markdownHeadingRule markdownRule 110hi def link markdownHeadingDelimiter Delimiter 111hi def link markdownOrderedListMarker markdownListMarker 112hi def link markdownListMarker htmlTagName 113hi def link markdownBlockquote Comment 114hi def link markdownRule PreProc 115 116hi def link markdownFootnote Typedef 117hi def link markdownFootnoteDefinition Typedef 118 119hi def link markdownLinkText htmlLink 120hi def link markdownIdDeclaration Typedef 121hi def link markdownId Type 122hi def link markdownAutomaticLink markdownUrl 123hi def link markdownUrl Float 124hi def link markdownUrlTitle String 125hi def link markdownIdDelimiter markdownLinkDelimiter 126hi def link markdownUrlDelimiter htmlTag 127hi def link markdownUrlTitleDelimiter Delimiter 128 129hi def link markdownItalic htmlItalic 130hi def link markdownItalicDelimiter markdownItalic 131hi def link markdownBold htmlBold 132hi def link markdownBoldDelimiter markdownBold 133hi def link markdownBoldItalic htmlBoldItalic 134hi def link markdownBoldItalicDelimiter markdownBoldItalic 135hi def link markdownCodeDelimiter Delimiter 136 137hi def link markdownEscape Special 138hi def link markdownError Error 139 140let b:current_syntax = "markdown" 141if main_syntax ==# 'markdown' 142 unlet main_syntax 143endif 144 145" vim:set sw=2: 146