Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 1 | " Vim syntax file |
| 2 | " Language: Markdown |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 3 | " Maintainer: Tim Pope <https://github.com/tpope/vim-markdown> |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 4 | " Filenames: *.markdown |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 5 | " Last Change: 2022 Oct 13 |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 6 | |
| 7 | if exists("b:current_syntax") |
| 8 | finish |
| 9 | endif |
| 10 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 11 | if !exists('main_syntax') |
| 12 | let main_syntax = 'markdown' |
| 13 | endif |
| 14 | |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 15 | if has('folding') |
| 16 | let s:foldmethod = &l:foldmethod |
| 17 | let s:foldtext = &l:foldtext |
| 18 | endif |
| 19 | let s:iskeyword = &l:iskeyword |
| 20 | |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 21 | runtime! syntax/html.vim |
| 22 | unlet! b:current_syntax |
| 23 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 24 | if !exists('g:markdown_fenced_languages') |
| 25 | let g:markdown_fenced_languages = [] |
| 26 | endif |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 27 | let s:done_include = {} |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 28 | for s:type in map(copy(g:markdown_fenced_languages),'matchstr(v:val,"[^=]*$")') |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 29 | if has_key(s:done_include, matchstr(s:type,'[^.]*')) |
| 30 | continue |
| 31 | endif |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 32 | if s:type =~ '\.' |
| 33 | let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*') |
| 34 | endif |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 35 | syn case match |
| 36 | exe 'syn include @markdownHighlight_'.tr(s:type,'.','_').' syntax/'.matchstr(s:type,'[^.]*').'.vim' |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 37 | unlet! b:current_syntax |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 38 | let s:done_include[matchstr(s:type,'[^.]*')] = 1 |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 39 | endfor |
| 40 | unlet! s:type |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 41 | unlet! s:done_include |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 42 | |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 43 | syn spell toplevel |
| 44 | if exists('s:foldmethod') && s:foldmethod !=# &l:foldmethod |
| 45 | let &l:foldmethod = s:foldmethod |
| 46 | unlet s:foldmethod |
| 47 | endif |
| 48 | if exists('s:foldtext') && s:foldtext !=# &l:foldtext |
| 49 | let &l:foldtext = s:foldtext |
| 50 | unlet s:foldtext |
| 51 | endif |
| 52 | if s:iskeyword !=# &l:iskeyword |
| 53 | let &l:iskeyword = s:iskeyword |
| 54 | endif |
| 55 | unlet s:iskeyword |
| 56 | |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 57 | if !exists('g:markdown_minlines') |
| 58 | let g:markdown_minlines = 50 |
| 59 | endif |
| 60 | execute 'syn sync minlines=' . g:markdown_minlines |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 61 | syn sync linebreaks=1 |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 62 | syn case ignore |
| 63 | |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 64 | syn match markdownValid '[<>]\c[a-z/$!]\@!' transparent contains=NONE |
| 65 | syn match markdownValid '&\%(#\=\w*;\)\@!' transparent contains=NONE |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 66 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 67 | syn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock,htmlSpecialChar |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 68 | |
| 69 | syn cluster markdownBlock contains=markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6,markdownBlockquote,markdownListMarker,markdownOrderedListMarker,markdownCodeBlock,markdownRule |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 70 | syn cluster markdownInline contains=markdownLineBreak,markdownLinkText,markdownItalic,markdownBold,markdownCode,markdownEscape,@htmlTop,markdownError,markdownValid |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 71 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 72 | syn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink |
| 73 | syn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 74 | |
| 75 | syn match markdownHeadingRule "^[=-]\+$" contained |
| 76 | |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 77 | syn region markdownH1 matchgroup=markdownH1Delimiter start=" \{,3}#\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained |
| 78 | syn region markdownH2 matchgroup=markdownH2Delimiter start=" \{,3}##\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained |
| 79 | syn region markdownH3 matchgroup=markdownH3Delimiter start=" \{,3}###\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained |
| 80 | syn region markdownH4 matchgroup=markdownH4Delimiter start=" \{,3}####\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained |
| 81 | syn region markdownH5 matchgroup=markdownH5Delimiter start=" \{,3}#####\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained |
| 82 | syn region markdownH6 matchgroup=markdownH6Delimiter start=" \{,3}######\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 83 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 84 | syn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 85 | |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 86 | syn region markdownCodeBlock start="^\n\( \{4,}\|\t\)" end="^\ze \{,3}\S.*$" keepend |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 87 | |
| 88 | " TODO: real nesting |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 89 | syn match markdownListMarker "\%(\t\| \{0,4\}\)[-*+]\%(\s\+\S\)\@=" contained |
| 90 | syn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s\+\S\)\@=" contained |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 91 | |
| 92 | syn match markdownRule "\* *\* *\*[ *]*$" contained |
| 93 | syn match markdownRule "- *- *-[ -]*$" contained |
| 94 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 95 | syn match markdownLineBreak " \{2,\}$" |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 96 | |
| 97 | syn region markdownIdDeclaration matchgroup=markdownLinkDelimiter start="^ \{0,3\}!\=\[" end="\]:" oneline keepend nextgroup=markdownUrl skipwhite |
| 98 | syn match markdownUrl "\S\+" nextgroup=markdownUrlTitle skipwhite contained |
| 99 | syn region markdownUrl matchgroup=markdownUrlDelimiter start="<" end=">" oneline keepend nextgroup=markdownUrlTitle skipwhite contained |
| 100 | syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+"+ end=+"+ keepend contained |
| 101 | syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+'+ end=+'+ keepend contained |
| 102 | syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+(+ end=+)+ keepend contained |
| 103 | |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 104 | syn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\_[^][]*\%(\[\_[^][]*\]\_[^][]*\)*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 105 | syn region markdownLink matchgroup=markdownLinkDelimiter start="(" end=")" contains=markdownUrl keepend contained |
| 106 | syn region markdownId matchgroup=markdownIdDelimiter start="\[" end="\]" keepend contained |
| 107 | syn region markdownAutomaticLink matchgroup=markdownUrlDelimiter start="<\%(\w\+:\|[[:alnum:]_+-]\+@\)\@=" end=">" keepend oneline |
| 108 | |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 109 | let s:concealends = '' |
| 110 | if has('conceal') && get(g:, 'markdown_syntax_conceal', 1) == 1 |
| 111 | let s:concealends = ' concealends' |
| 112 | endif |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 113 | exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\*\S\@=" end="\S\@<=\*\|^$" skip="\\\*" contains=markdownLineStart,@Spell' . s:concealends |
| 114 | exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\w\@<!_\S\@=" end="\S\@<=_\w\@!\|^$" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends |
| 115 | exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\*\*\S\@=" end="\S\@<=\*\*\|^$" skip="\\\*" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends |
| 116 | exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\w\@<!__\S\@=" end="\S\@<=__\w\@!\|^$" skip="\\_" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends |
| 117 | exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\*\*\*\S\@=" end="\S\@<=\*\*\*\|^$" skip="\\\*" contains=markdownLineStart,@Spell' . s:concealends |
| 118 | exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\w\@<!___\S\@=" end="\S\@<=___\w\@!\|^$" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends |
| 119 | exe 'syn region markdownStrike matchgroup=markdownStrikeDelimiter start="\~\~\S\@=" end="\S\@<=\~\~\|^$" contains=markdownLineStart,@Spell' . s:concealends |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 120 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 121 | syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 122 | syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 123 | syn region markdownCodeBlock matchgroup=markdownCodeDelimiter start="^\s*\z(`\{3,\}\).*$" end="^\s*\z1\ze\s*$" keepend |
| 124 | syn region markdownCodeBlock matchgroup=markdownCodeDelimiter start="^\s*\z(\~\{3,\}\).*$" end="^\s*\z1\ze\s*$" keepend |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 125 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 126 | syn match markdownFootnote "\[^[^\]]\+\]" |
| 127 | syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:" |
| 128 | |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 129 | let s:done_include = {} |
| 130 | for s:type in g:markdown_fenced_languages |
| 131 | if has_key(s:done_include, matchstr(s:type,'[^.]*')) |
| 132 | continue |
| 133 | endif |
| 134 | exe 'syn region markdownHighlight_'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*\z(`\{3,\}\)\s*\%({.\{-}\.\)\='.matchstr(s:type,'[^=]*').'}\=\S\@!.*$" end="^\s*\z1\ze\s*$" keepend contains=@markdownHighlight_'.tr(matchstr(s:type,'[^=]*$'),'.','_') . s:concealends |
| 135 | exe 'syn region markdownHighlight_'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*\z(\~\{3,\}\)\s*\%({.\{-}\.\)\='.matchstr(s:type,'[^=]*').'}\=\S\@!.*$" end="^\s*\z1\ze\s*$" keepend contains=@markdownHighlight_'.tr(matchstr(s:type,'[^=]*$'),'.','_') . s:concealends |
| 136 | let s:done_include[matchstr(s:type,'[^.]*')] = 1 |
| 137 | endfor |
| 138 | unlet! s:type |
| 139 | unlet! s:done_include |
| 140 | |
| 141 | if get(b:, 'markdown_yaml_head', get(g:, 'markdown_yaml_head', main_syntax ==# 'markdown')) |
| 142 | syn include @markdownYamlTop syntax/yaml.vim |
| 143 | unlet! b:current_syntax |
| 144 | syn region markdownYamlHead start="\%^---$" end="^\%(---\|\.\.\.\)\s*$" keepend contains=@markdownYamlTop,@Spell |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 145 | endif |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 146 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 147 | syn match markdownEscape "\\[][\\`*_{}()<>#+.!-]" |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 148 | syn match markdownError "\w\@<=_\w\@=" |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 149 | |
| 150 | hi def link markdownH1 htmlH1 |
| 151 | hi def link markdownH2 htmlH2 |
| 152 | hi def link markdownH3 htmlH3 |
| 153 | hi def link markdownH4 htmlH4 |
| 154 | hi def link markdownH5 htmlH5 |
| 155 | hi def link markdownH6 htmlH6 |
| 156 | hi def link markdownHeadingRule markdownRule |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 157 | hi def link markdownH1Delimiter markdownHeadingDelimiter |
| 158 | hi def link markdownH2Delimiter markdownHeadingDelimiter |
| 159 | hi def link markdownH3Delimiter markdownHeadingDelimiter |
| 160 | hi def link markdownH4Delimiter markdownHeadingDelimiter |
| 161 | hi def link markdownH5Delimiter markdownHeadingDelimiter |
| 162 | hi def link markdownH6Delimiter markdownHeadingDelimiter |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 163 | hi def link markdownHeadingDelimiter Delimiter |
| 164 | hi def link markdownOrderedListMarker markdownListMarker |
| 165 | hi def link markdownListMarker htmlTagName |
| 166 | hi def link markdownBlockquote Comment |
| 167 | hi def link markdownRule PreProc |
| 168 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 169 | hi def link markdownFootnote Typedef |
| 170 | hi def link markdownFootnoteDefinition Typedef |
| 171 | |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 172 | hi def link markdownLinkText htmlLink |
| 173 | hi def link markdownIdDeclaration Typedef |
| 174 | hi def link markdownId Type |
| 175 | hi def link markdownAutomaticLink markdownUrl |
| 176 | hi def link markdownUrl Float |
| 177 | hi def link markdownUrlTitle String |
| 178 | hi def link markdownIdDelimiter markdownLinkDelimiter |
| 179 | hi def link markdownUrlDelimiter htmlTag |
| 180 | hi def link markdownUrlTitleDelimiter Delimiter |
| 181 | |
| 182 | hi def link markdownItalic htmlItalic |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 183 | hi def link markdownItalicDelimiter markdownItalic |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 184 | hi def link markdownBold htmlBold |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 185 | hi def link markdownBoldDelimiter markdownBold |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 186 | hi def link markdownBoldItalic htmlBoldItalic |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 187 | hi def link markdownBoldItalicDelimiter markdownBoldItalic |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 188 | hi def link markdownStrike htmlStrike |
| 189 | hi def link markdownStrikeDelimiter markdownStrike |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 190 | hi def link markdownCodeDelimiter Delimiter |
| 191 | |
| 192 | hi def link markdownEscape Special |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 193 | hi def link markdownError Error |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 194 | |
| 195 | let b:current_syntax = "markdown" |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 196 | if main_syntax ==# 'markdown' |
| 197 | unlet main_syntax |
| 198 | endif |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 199 | |
| 200 | " vim:set sw=2: |