blob: 1955a7443e15368cc8806d3fcc1c34d228c1b070 [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 Moolenaar89bcfda2016-08-30 23:26:57 +02005" Last Change: 2016 Aug 29
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
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020073syn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\_[^]]*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart
Bram Moolenaar7a329912010-05-21 12:05:36 +020074syn 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
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020078let 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
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020086syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart
Bram Moolenaar7a329912010-05-21 12:05:36 +020087syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020088syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*```.*$" end="^\s*```\ze\s*$" keepend
89
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020090syn match markdownFootnote "\[^[^\]]\+\]"
91syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:"
92
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020093if main_syntax ==# 'markdown'
94 for s:type in g:markdown_fenced_languages
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020095 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')
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020096 endfor
97 unlet! s:type
98endif
Bram Moolenaar7a329912010-05-21 12:05:36 +020099
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200100syn match markdownEscape "\\[][\\`*_{}()<>#+.!-]"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200101syn match markdownError "\w\@<=_\w\@="
Bram Moolenaar7a329912010-05-21 12:05:36 +0200102
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
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200116hi def link markdownFootnote Typedef
117hi def link markdownFootnoteDefinition Typedef
118
Bram Moolenaar7a329912010-05-21 12:05:36 +0200119hi 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
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200130hi def link markdownItalicDelimiter markdownItalic
Bram Moolenaar7a329912010-05-21 12:05:36 +0200131hi def link markdownBold htmlBold
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200132hi def link markdownBoldDelimiter markdownBold
Bram Moolenaar7a329912010-05-21 12:05:36 +0200133hi def link markdownBoldItalic htmlBoldItalic
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200134hi def link markdownBoldItalicDelimiter markdownBoldItalic
Bram Moolenaar7a329912010-05-21 12:05:36 +0200135hi def link markdownCodeDelimiter Delimiter
136
137hi def link markdownEscape Special
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200138hi def link markdownError Error
Bram Moolenaar7a329912010-05-21 12:05:36 +0200139
140let b:current_syntax = "markdown"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200141if main_syntax ==# 'markdown'
142 unlet main_syntax
143endif
Bram Moolenaar7a329912010-05-21 12:05:36 +0200144
145" vim:set sw=2: