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