blob: 068115e92d468a9d3c763545b6d4c34cde582cfd [file] [log] [blame]
Bram Moolenaar7a329912010-05-21 12:05:36 +02001" Vim syntax file
2" Language: Markdown
3" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
4" Filenames: *.markdown
Bram Moolenaar543b7ef2013-06-01 14:50:56 +02005" Last Change: 2013 May 30
Bram Moolenaar7a329912010-05-21 12:05:36 +02006
7if exists("b:current_syntax")
8 finish
9endif
10
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020011if !exists('main_syntax')
12 let main_syntax = 'markdown'
13endif
14
Bram Moolenaar7a329912010-05-21 12:05:36 +020015runtime! syntax/html.vim
16unlet! b:current_syntax
17
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020018if !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
Bram Moolenaar7a329912010-05-21 12:05:36 +020030syn sync minlines=10
31syn case ignore
32
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020033syn match markdownValid '[<>]\c[a-z/$!]\@!'
Bram Moolenaar7a329912010-05-21 12:05:36 +020034syn match markdownValid '&\%(#\=\w*;\)\@!'
35
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020036syn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock,htmlSpecialChar
Bram Moolenaar7a329912010-05-21 12:05:36 +020037
38syn cluster markdownBlock contains=markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6,markdownBlockquote,markdownListMarker,markdownOrderedListMarker,markdownCodeBlock,markdownRule
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020039syn cluster markdownInline contains=markdownLineBreak,markdownLinkText,markdownItalic,markdownBold,markdownCode,markdownEscape,@htmlTop,markdownError
Bram Moolenaar7a329912010-05-21 12:05:36 +020040
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020041syn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink
42syn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink
Bram Moolenaar7a329912010-05-21 12:05:36 +020043
44syn match markdownHeadingRule "^[=-]\+$" contained
45
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020046syn 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
Bram Moolenaar7a329912010-05-21 12:05:36 +020052
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020053syn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock
Bram Moolenaar7a329912010-05-21 12:05:36 +020054
55syn region markdownCodeBlock start=" \|\t" end="$" contained
56
57" TODO: real nesting
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020058syn match markdownListMarker "\%(\t\| \{0,4\}\)[-*+]\%(\s\+\S\)\@=" contained
59syn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s\+\S\)\@=" contained
Bram Moolenaar7a329912010-05-21 12:05:36 +020060
61syn match markdownRule "\* *\* *\*[ *]*$" contained
62syn match markdownRule "- *- *-[ -]*$" contained
63
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020064syn match markdownLineBreak " \{2,\}$"
Bram Moolenaar7a329912010-05-21 12:05:36 +020065
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
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020080syn 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
Bram Moolenaar7a329912010-05-21 12:05:36 +020082syn region markdownBoldItalic start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" keepend contains=markdownLineStart
83syn region markdownBoldItalic start="\S\@<=___\|___\S\@=" end="\S\@<=___\|___\S\@=" keepend contains=markdownLineStart
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020084syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart
Bram Moolenaar7a329912010-05-21 12:05:36 +020085syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020086syn 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
Bram Moolenaar7a329912010-05-21 12:05:36 +020094
95syn match markdownEscape "\\[][\\`*_{}()#+.!-]"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020096syn match markdownError "\w\@<=_\w\@="
Bram Moolenaar7a329912010-05-21 12:05:36 +020097
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
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200127hi def link markdownError Error
Bram Moolenaar7a329912010-05-21 12:05:36 +0200128
129let b:current_syntax = "markdown"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200130if main_syntax ==# 'markdown'
131 unlet main_syntax
132endif
Bram Moolenaar7a329912010-05-21 12:05:36 +0200133
134" vim:set sw=2: