xref: /vim-8.2.3635/runtime/syntax/markdown.vim (revision ade0d394)
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