17a329911SBram Moolenaar" Vim syntax file 27a329911SBram Moolenaar" Language: Markdown 37a329911SBram Moolenaar" Maintainer: Tim Pope <[email protected]> 47a329911SBram Moolenaar" Filenames: *.markdown 5*ade0d394SBram Moolenaar" Last Change: 2020 Jan 14 67a329911SBram Moolenaar 77a329911SBram Moolenaarif exists("b:current_syntax") 87a329911SBram Moolenaar finish 97a329911SBram Moolenaarendif 107a329911SBram Moolenaar 11543b7ef7SBram Moolenaarif !exists('main_syntax') 12543b7ef7SBram Moolenaar let main_syntax = 'markdown' 13543b7ef7SBram Moolenaarendif 14543b7ef7SBram Moolenaar 157a329911SBram Moolenaarruntime! syntax/html.vim 167a329911SBram Moolenaarunlet! b:current_syntax 177a329911SBram Moolenaar 18543b7ef7SBram Moolenaarif !exists('g:markdown_fenced_languages') 19543b7ef7SBram Moolenaar let g:markdown_fenced_languages = [] 20543b7ef7SBram Moolenaarendif 21c08ee747SBram Moolenaarlet s:done_include = {} 22543b7ef7SBram Moolenaarfor s:type in map(copy(g:markdown_fenced_languages),'matchstr(v:val,"[^=]*$")') 23c08ee747SBram Moolenaar if has_key(s:done_include, matchstr(s:type,'[^.]*')) 24c08ee747SBram Moolenaar continue 25c08ee747SBram Moolenaar endif 26543b7ef7SBram Moolenaar if s:type =~ '\.' 27543b7ef7SBram Moolenaar let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*') 28543b7ef7SBram Moolenaar endif 29543b7ef7SBram Moolenaar exe 'syn include @markdownHighlight'.substitute(s:type,'\.','','g').' syntax/'.matchstr(s:type,'[^.]*').'.vim' 30543b7ef7SBram Moolenaar unlet! b:current_syntax 31c08ee747SBram Moolenaar let s:done_include[matchstr(s:type,'[^.]*')] = 1 32543b7ef7SBram Moolenaarendfor 33543b7ef7SBram Moolenaarunlet! s:type 34c08ee747SBram Moolenaarunlet! s:done_include 35543b7ef7SBram Moolenaar 36c08ee747SBram Moolenaarif !exists('g:markdown_minlines') 37c08ee747SBram Moolenaar let g:markdown_minlines = 50 38c08ee747SBram Moolenaarendif 39c08ee747SBram Moolenaarexecute 'syn sync minlines=' . g:markdown_minlines 407a329911SBram Moolenaarsyn case ignore 417a329911SBram Moolenaar 42c08ee747SBram Moolenaarsyn match markdownValid '[<>]\c[a-z/$!]\@!' transparent contains=NONE 43c08ee747SBram Moolenaarsyn match markdownValid '&\%(#\=\w*;\)\@!' transparent contains=NONE 447a329911SBram Moolenaar 45543b7ef7SBram Moolenaarsyn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock,htmlSpecialChar 467a329911SBram Moolenaar 477a329911SBram Moolenaarsyn cluster markdownBlock contains=markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6,markdownBlockquote,markdownListMarker,markdownOrderedListMarker,markdownCodeBlock,markdownRule 48c08ee747SBram Moolenaarsyn cluster markdownInline contains=markdownLineBreak,markdownLinkText,markdownItalic,markdownBold,markdownCode,markdownEscape,@htmlTop,markdownError,markdownValid 497a329911SBram Moolenaar 50543b7ef7SBram Moolenaarsyn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink 51543b7ef7SBram Moolenaarsyn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink 527a329911SBram Moolenaar 537a329911SBram Moolenaarsyn match markdownHeadingRule "^[=-]\+$" contained 547a329911SBram Moolenaar 55c08ee747SBram Moolenaarsyn region markdownH1 matchgroup=markdownH1Delimiter start="##\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 56c08ee747SBram Moolenaarsyn region markdownH2 matchgroup=markdownH2Delimiter start="###\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 57c08ee747SBram Moolenaarsyn region markdownH3 matchgroup=markdownH3Delimiter start="####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 58c08ee747SBram Moolenaarsyn region markdownH4 matchgroup=markdownH4Delimiter start="#####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 59c08ee747SBram Moolenaarsyn region markdownH5 matchgroup=markdownH5Delimiter start="######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 60c08ee747SBram Moolenaarsyn region markdownH6 matchgroup=markdownH6Delimiter start="#######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained 617a329911SBram Moolenaar 62543b7ef7SBram Moolenaarsyn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock 637a329911SBram Moolenaar 647a329911SBram Moolenaarsyn region markdownCodeBlock start=" \|\t" end="$" contained 657a329911SBram Moolenaar 667a329911SBram Moolenaar" TODO: real nesting 67543b7ef7SBram Moolenaarsyn match markdownListMarker "\%(\t\| \{0,4\}\)[-*+]\%(\s\+\S\)\@=" contained 68543b7ef7SBram Moolenaarsyn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s\+\S\)\@=" contained 697a329911SBram Moolenaar 707a329911SBram Moolenaarsyn match markdownRule "\* *\* *\*[ *]*$" contained 717a329911SBram Moolenaarsyn match markdownRule "- *- *-[ -]*$" contained 727a329911SBram Moolenaar 73543b7ef7SBram Moolenaarsyn match markdownLineBreak " \{2,\}$" 747a329911SBram Moolenaar 757a329911SBram Moolenaarsyn region markdownIdDeclaration matchgroup=markdownLinkDelimiter start="^ \{0,3\}!\=\[" end="\]:" oneline keepend nextgroup=markdownUrl skipwhite 767a329911SBram Moolenaarsyn match markdownUrl "\S\+" nextgroup=markdownUrlTitle skipwhite contained 777a329911SBram Moolenaarsyn region markdownUrl matchgroup=markdownUrlDelimiter start="<" end=">" oneline keepend nextgroup=markdownUrlTitle skipwhite contained 787a329911SBram Moolenaarsyn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+"+ end=+"+ keepend contained 797a329911SBram Moolenaarsyn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+'+ end=+'+ keepend contained 807a329911SBram Moolenaarsyn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+(+ end=+)+ keepend contained 817a329911SBram Moolenaar 82c08ee747SBram Moolenaarsyn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\%(\_[^][]\|\[\_[^][]*\]\)*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart 837a329911SBram Moolenaarsyn region markdownLink matchgroup=markdownLinkDelimiter start="(" end=")" contains=markdownUrl keepend contained 847a329911SBram Moolenaarsyn region markdownId matchgroup=markdownIdDelimiter start="\[" end="\]" keepend contained 857a329911SBram Moolenaarsyn region markdownAutomaticLink matchgroup=markdownUrlDelimiter start="<\%(\w\+:\|[[:alnum:]_+-]\+@\)\@=" end=">" keepend oneline 867a329911SBram Moolenaar 87c08ee747SBram Moolenaarlet s:concealends = '' 88c08ee747SBram Moolenaarif has('conceal') && get(g:, 'markdown_syntax_conceal', 1) == 1 89c08ee747SBram Moolenaar let s:concealends = ' concealends' 90c08ee747SBram Moolenaarendif 91*ade0d394SBram Moolenaarexe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" skip="\\\*" contains=markdownLineStart,@Spell' . s:concealends 92c08ee747SBram Moolenaarexe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\w\@<!_\S\@=" end="\S\@<=_\w\@!" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends 93*ade0d394SBram Moolenaarexe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" skip="\\\*" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends 94c08ee747SBram Moolenaarexe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\w\@<!__\S\@=" end="\S\@<=__\w\@!" skip="\\_" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends 95*ade0d394SBram Moolenaarexe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" skip="\\\*" contains=markdownLineStart,@Spell' . s:concealends 96c08ee747SBram Moolenaarexe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\w\@<!___\S\@=" end="\S\@<=___\w\@!" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends 9789bcfda6SBram Moolenaar 98543b7ef7SBram Moolenaarsyn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart 997a329911SBram Moolenaarsyn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart 100c08ee747SBram Moolenaarsyn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*````*.*$" end="^\s*````*\ze\s*$" keepend 101543b7ef7SBram Moolenaar 10289bcfda6SBram Moolenaarsyn match markdownFootnote "\[^[^\]]\+\]" 10389bcfda6SBram Moolenaarsyn match markdownFootnoteDefinition "^\[^[^\]]\+\]:" 10489bcfda6SBram Moolenaar 105543b7ef7SBram Moolenaarif main_syntax ==# 'markdown' 106c08ee747SBram Moolenaar let s:done_include = {} 107543b7ef7SBram Moolenaar for s:type in g:markdown_fenced_languages 108c08ee747SBram Moolenaar if has_key(s:done_include, matchstr(s:type,'[^.]*')) 109c08ee747SBram Moolenaar continue 110c08ee747SBram Moolenaar endif 111c08ee747SBram Moolenaar exe 'syn region markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*````*\s*\%({.\{-}\.\)\='.matchstr(s:type,'[^=]*').'}\=\S\@!.*$" end="^\s*````*\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g') . s:concealends 112c08ee747SBram Moolenaar let s:done_include[matchstr(s:type,'[^.]*')] = 1 113543b7ef7SBram Moolenaar endfor 114543b7ef7SBram Moolenaar unlet! s:type 115c08ee747SBram Moolenaar unlet! s:done_include 116543b7ef7SBram Moolenaarendif 1177a329911SBram Moolenaar 11889bcfda6SBram Moolenaarsyn match markdownEscape "\\[][\\`*_{}()<>#+.!-]" 119543b7ef7SBram Moolenaarsyn match markdownError "\w\@<=_\w\@=" 1207a329911SBram Moolenaar 1217a329911SBram Moolenaarhi def link markdownH1 htmlH1 1227a329911SBram Moolenaarhi def link markdownH2 htmlH2 1237a329911SBram Moolenaarhi def link markdownH3 htmlH3 1247a329911SBram Moolenaarhi def link markdownH4 htmlH4 1257a329911SBram Moolenaarhi def link markdownH5 htmlH5 1267a329911SBram Moolenaarhi def link markdownH6 htmlH6 1277a329911SBram Moolenaarhi def link markdownHeadingRule markdownRule 128c08ee747SBram Moolenaarhi def link markdownH1Delimiter markdownHeadingDelimiter 129c08ee747SBram Moolenaarhi def link markdownH2Delimiter markdownHeadingDelimiter 130c08ee747SBram Moolenaarhi def link markdownH3Delimiter markdownHeadingDelimiter 131c08ee747SBram Moolenaarhi def link markdownH4Delimiter markdownHeadingDelimiter 132c08ee747SBram Moolenaarhi def link markdownH5Delimiter markdownHeadingDelimiter 133c08ee747SBram Moolenaarhi def link markdownH6Delimiter markdownHeadingDelimiter 1347a329911SBram Moolenaarhi def link markdownHeadingDelimiter Delimiter 1357a329911SBram Moolenaarhi def link markdownOrderedListMarker markdownListMarker 1367a329911SBram Moolenaarhi def link markdownListMarker htmlTagName 1377a329911SBram Moolenaarhi def link markdownBlockquote Comment 1387a329911SBram Moolenaarhi def link markdownRule PreProc 1397a329911SBram Moolenaar 14089bcfda6SBram Moolenaarhi def link markdownFootnote Typedef 14189bcfda6SBram Moolenaarhi def link markdownFootnoteDefinition Typedef 14289bcfda6SBram Moolenaar 1437a329911SBram Moolenaarhi def link markdownLinkText htmlLink 1447a329911SBram Moolenaarhi def link markdownIdDeclaration Typedef 1457a329911SBram Moolenaarhi def link markdownId Type 1467a329911SBram Moolenaarhi def link markdownAutomaticLink markdownUrl 1477a329911SBram Moolenaarhi def link markdownUrl Float 1487a329911SBram Moolenaarhi def link markdownUrlTitle String 1497a329911SBram Moolenaarhi def link markdownIdDelimiter markdownLinkDelimiter 1507a329911SBram Moolenaarhi def link markdownUrlDelimiter htmlTag 1517a329911SBram Moolenaarhi def link markdownUrlTitleDelimiter Delimiter 1527a329911SBram Moolenaar 1537a329911SBram Moolenaarhi def link markdownItalic htmlItalic 15489bcfda6SBram Moolenaarhi def link markdownItalicDelimiter markdownItalic 1557a329911SBram Moolenaarhi def link markdownBold htmlBold 15689bcfda6SBram Moolenaarhi def link markdownBoldDelimiter markdownBold 1577a329911SBram Moolenaarhi def link markdownBoldItalic htmlBoldItalic 15889bcfda6SBram Moolenaarhi def link markdownBoldItalicDelimiter markdownBoldItalic 1597a329911SBram Moolenaarhi def link markdownCodeDelimiter Delimiter 1607a329911SBram Moolenaar 1617a329911SBram Moolenaarhi def link markdownEscape Special 162543b7ef7SBram Moolenaarhi def link markdownError Error 1637a329911SBram Moolenaar 1647a329911SBram Moolenaarlet b:current_syntax = "markdown" 165543b7ef7SBram Moolenaarif main_syntax ==# 'markdown' 166543b7ef7SBram Moolenaar unlet main_syntax 167543b7ef7SBram Moolenaarendif 1687a329911SBram Moolenaar 1697a329911SBram Moolenaar" vim:set sw=2: 170