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