blob: 0321ca3ce1740fe4ad3864442511ebf80ea13d7f [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 Moolenaarc08ee742019-12-05 22:47:25 +01005" Last Change: 2019 Dec 05
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
Bram Moolenaarc08ee742019-12-05 22:47:25 +010021let s:done_include = {}
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020022for s:type in map(copy(g:markdown_fenced_languages),'matchstr(v:val,"[^=]*$")')
Bram Moolenaarc08ee742019-12-05 22:47:25 +010023 if has_key(s:done_include, matchstr(s:type,'[^.]*'))
24 continue
25 endif
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020026 if s:type =~ '\.'
27 let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*')
28 endif
29 exe 'syn include @markdownHighlight'.substitute(s:type,'\.','','g').' syntax/'.matchstr(s:type,'[^.]*').'.vim'
30 unlet! b:current_syntax
Bram Moolenaarc08ee742019-12-05 22:47:25 +010031 let s:done_include[matchstr(s:type,'[^.]*')] = 1
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020032endfor
33unlet! s:type
Bram Moolenaarc08ee742019-12-05 22:47:25 +010034unlet! s:done_include
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020035
Bram Moolenaarc08ee742019-12-05 22:47:25 +010036if !exists('g:markdown_minlines')
37 let g:markdown_minlines = 50
38endif
39execute 'syn sync minlines=' . g:markdown_minlines
Bram Moolenaar7a329912010-05-21 12:05:36 +020040syn case ignore
41
Bram Moolenaarc08ee742019-12-05 22:47:25 +010042syn match markdownValid '[<>]\c[a-z/$!]\@!' transparent contains=NONE
43syn match markdownValid '&\%(#\=\w*;\)\@!' transparent contains=NONE
Bram Moolenaar7a329912010-05-21 12:05:36 +020044
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020045syn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock,htmlSpecialChar
Bram Moolenaar7a329912010-05-21 12:05:36 +020046
47syn cluster markdownBlock contains=markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6,markdownBlockquote,markdownListMarker,markdownOrderedListMarker,markdownCodeBlock,markdownRule
Bram Moolenaarc08ee742019-12-05 22:47:25 +010048syn cluster markdownInline contains=markdownLineBreak,markdownLinkText,markdownItalic,markdownBold,markdownCode,markdownEscape,@htmlTop,markdownError,markdownValid
Bram Moolenaar7a329912010-05-21 12:05:36 +020049
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020050syn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink
51syn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink
Bram Moolenaar7a329912010-05-21 12:05:36 +020052
53syn match markdownHeadingRule "^[=-]\+$" contained
54
Bram Moolenaarc08ee742019-12-05 22:47:25 +010055syn region markdownH1 matchgroup=markdownH1Delimiter start="##\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
56syn region markdownH2 matchgroup=markdownH2Delimiter start="###\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
57syn region markdownH3 matchgroup=markdownH3Delimiter start="####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
58syn region markdownH4 matchgroup=markdownH4Delimiter start="#####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
59syn region markdownH5 matchgroup=markdownH5Delimiter start="######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
60syn region markdownH6 matchgroup=markdownH6Delimiter start="#######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
Bram Moolenaar7a329912010-05-21 12:05:36 +020061
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020062syn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock
Bram Moolenaar7a329912010-05-21 12:05:36 +020063
64syn region markdownCodeBlock start=" \|\t" end="$" contained
65
66" TODO: real nesting
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020067syn match markdownListMarker "\%(\t\| \{0,4\}\)[-*+]\%(\s\+\S\)\@=" contained
68syn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s\+\S\)\@=" contained
Bram Moolenaar7a329912010-05-21 12:05:36 +020069
70syn match markdownRule "\* *\* *\*[ *]*$" contained
71syn match markdownRule "- *- *-[ -]*$" contained
72
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020073syn match markdownLineBreak " \{2,\}$"
Bram Moolenaar7a329912010-05-21 12:05:36 +020074
75syn region markdownIdDeclaration matchgroup=markdownLinkDelimiter start="^ \{0,3\}!\=\[" end="\]:" oneline keepend nextgroup=markdownUrl skipwhite
76syn match markdownUrl "\S\+" nextgroup=markdownUrlTitle skipwhite contained
77syn region markdownUrl matchgroup=markdownUrlDelimiter start="<" end=">" oneline keepend nextgroup=markdownUrlTitle skipwhite contained
78syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+"+ end=+"+ keepend contained
79syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+'+ end=+'+ keepend contained
80syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+(+ end=+)+ keepend contained
81
Bram Moolenaarc08ee742019-12-05 22:47:25 +010082syn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\%(\_[^][]\|\[\_[^][]*\]\)*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart
Bram Moolenaar7a329912010-05-21 12:05:36 +020083syn region markdownLink matchgroup=markdownLinkDelimiter start="(" end=")" contains=markdownUrl keepend contained
84syn region markdownId matchgroup=markdownIdDelimiter start="\[" end="\]" keepend contained
85syn region markdownAutomaticLink matchgroup=markdownUrlDelimiter start="<\%(\w\+:\|[[:alnum:]_+-]\+@\)\@=" end=">" keepend oneline
86
Bram Moolenaarc08ee742019-12-05 22:47:25 +010087let s:concealends = ''
88if has('conceal') && get(g:, 'markdown_syntax_conceal', 1) == 1
89 let s:concealends = ' concealends'
90endif
91exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" skip="\\*" contains=markdownLineStart,@Spell' . s:concealends
92exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\w\@<!_\S\@=" end="\S\@<=_\w\@!" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends
93exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" skip="\\*" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends
94exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\w\@<!__\S\@=" end="\S\@<=__\w\@!" skip="\\_" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends
95exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" skip="\\*" contains=markdownLineStart,@Spell' . s:concealends
96exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\w\@<!___\S\@=" end="\S\@<=___\w\@!" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020097
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020098syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart
Bram Moolenaar7a329912010-05-21 12:05:36 +020099syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart
Bram Moolenaarc08ee742019-12-05 22:47:25 +0100100syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*````*.*$" end="^\s*````*\ze\s*$" keepend
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200101
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200102syn match markdownFootnote "\[^[^\]]\+\]"
103syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:"
104
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200105if main_syntax ==# 'markdown'
Bram Moolenaarc08ee742019-12-05 22:47:25 +0100106 let s:done_include = {}
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200107 for s:type in g:markdown_fenced_languages
Bram Moolenaarc08ee742019-12-05 22:47:25 +0100108 if has_key(s:done_include, matchstr(s:type,'[^.]*'))
109 continue
110 endif
111 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
112 let s:done_include[matchstr(s:type,'[^.]*')] = 1
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200113 endfor
114 unlet! s:type
Bram Moolenaarc08ee742019-12-05 22:47:25 +0100115 unlet! s:done_include
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200116endif
Bram Moolenaar7a329912010-05-21 12:05:36 +0200117
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200118syn match markdownEscape "\\[][\\`*_{}()<>#+.!-]"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200119syn match markdownError "\w\@<=_\w\@="
Bram Moolenaar7a329912010-05-21 12:05:36 +0200120
121hi def link markdownH1 htmlH1
122hi def link markdownH2 htmlH2
123hi def link markdownH3 htmlH3
124hi def link markdownH4 htmlH4
125hi def link markdownH5 htmlH5
126hi def link markdownH6 htmlH6
127hi def link markdownHeadingRule markdownRule
Bram Moolenaarc08ee742019-12-05 22:47:25 +0100128hi def link markdownH1Delimiter markdownHeadingDelimiter
129hi def link markdownH2Delimiter markdownHeadingDelimiter
130hi def link markdownH3Delimiter markdownHeadingDelimiter
131hi def link markdownH4Delimiter markdownHeadingDelimiter
132hi def link markdownH5Delimiter markdownHeadingDelimiter
133hi def link markdownH6Delimiter markdownHeadingDelimiter
Bram Moolenaar7a329912010-05-21 12:05:36 +0200134hi def link markdownHeadingDelimiter Delimiter
135hi def link markdownOrderedListMarker markdownListMarker
136hi def link markdownListMarker htmlTagName
137hi def link markdownBlockquote Comment
138hi def link markdownRule PreProc
139
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200140hi def link markdownFootnote Typedef
141hi def link markdownFootnoteDefinition Typedef
142
Bram Moolenaar7a329912010-05-21 12:05:36 +0200143hi def link markdownLinkText htmlLink
144hi def link markdownIdDeclaration Typedef
145hi def link markdownId Type
146hi def link markdownAutomaticLink markdownUrl
147hi def link markdownUrl Float
148hi def link markdownUrlTitle String
149hi def link markdownIdDelimiter markdownLinkDelimiter
150hi def link markdownUrlDelimiter htmlTag
151hi def link markdownUrlTitleDelimiter Delimiter
152
153hi def link markdownItalic htmlItalic
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200154hi def link markdownItalicDelimiter markdownItalic
Bram Moolenaar7a329912010-05-21 12:05:36 +0200155hi def link markdownBold htmlBold
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200156hi def link markdownBoldDelimiter markdownBold
Bram Moolenaar7a329912010-05-21 12:05:36 +0200157hi def link markdownBoldItalic htmlBoldItalic
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200158hi def link markdownBoldItalicDelimiter markdownBoldItalic
Bram Moolenaar7a329912010-05-21 12:05:36 +0200159hi def link markdownCodeDelimiter Delimiter
160
161hi def link markdownEscape Special
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200162hi def link markdownError Error
Bram Moolenaar7a329912010-05-21 12:05:36 +0200163
164let b:current_syntax = "markdown"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200165if main_syntax ==# 'markdown'
166 unlet main_syntax
167endif
Bram Moolenaar7a329912010-05-21 12:05:36 +0200168
169" vim:set sw=2: