markdown.vim (10584B)
1 " Vim syntax file 2 " Language: Markdown 3 " Maintainer: Tim Pope <https://github.com/tpope/vim-markdown> 4 " Filenames: *.markdown 5 " Last Change: 2022 Oct 13 6 7 if exists("b:current_syntax") 8 finish 9 endif 10 11 if !exists('main_syntax') 12 let main_syntax = 'markdown' 13 endif 14 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 21 runtime! syntax/html.vim 22 unlet! b:current_syntax 23 24 if !exists('g:markdown_fenced_languages') 25 let g:markdown_fenced_languages = [] 26 endif 27 let s:done_include = {} 28 for s:type in map(copy(g:markdown_fenced_languages),'matchstr(v:val,"[^=]*$")') 29 if has_key(s:done_include, matchstr(s:type,'[^.]*')) 30 continue 31 endif 32 if s:type =~ '\.' 33 let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*') 34 endif 35 syn case match 36 exe 'syn include @markdownHighlight_'.tr(s:type,'.','_').' syntax/'.matchstr(s:type,'[^.]*').'.vim' 37 unlet! b:current_syntax 38 let s:done_include[matchstr(s:type,'[^.]*')] = 1 39 endfor 40 unlet! s:type 41 unlet! s:done_include 42 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 57 if !exists('g:markdown_minlines') 58 let g:markdown_minlines = 50 59 endif 60 execute 'syn sync minlines=' . g:markdown_minlines 61 syn sync linebreaks=1 62 syn case ignore 63 64 syn match markdownValid '[<>]\c[a-z/$!]\@!' transparent contains=NONE 65 syn match markdownValid '&\%(#\=\w*;\)\@!' transparent contains=NONE 66 67 syn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock,htmlSpecialChar 68 69 syn cluster markdownBlock contains=markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6,markdownBlockquote,markdownListMarker,markdownOrderedListMarker,markdownCodeBlock,markdownRule 70 syn cluster markdownInline contains=markdownLineBreak,markdownLinkText,markdownItalic,markdownBold,markdownCode,markdownEscape,@htmlTop,markdownError,markdownValid 71 72 syn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink 73 syn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink 74 75 syn match markdownHeadingRule "^[=-]\+$" contained 76 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 83 84 syn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock 85 86 syn region markdownCodeBlock start="^\n\( \{4,}\|\t\)" end="^\ze \{,3}\S.*$" keepend 87 88 " TODO: real nesting 89 syn match markdownListMarker "\%(\t\| \{0,4\}\)[-*+]\%(\s\+\S\)\@=" contained 90 syn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s\+\S\)\@=" contained 91 92 syn match markdownRule "\* *\* *\*[ *]*$" contained 93 syn match markdownRule "- *- *-[ -]*$" contained 94 95 syn match markdownLineBreak " \{2,\}$" 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 104 syn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\_[^][]*\%(\[\_[^][]*\]\_[^][]*\)*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart 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 109 let s:concealends = '' 110 if has('conceal') && get(g:, 'markdown_syntax_conceal', 1) == 1 111 let s:concealends = ' concealends' 112 endif 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 120 121 syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart 122 syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart 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 125 126 syn match markdownFootnote "\[^[^\]]\+\]" 127 syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:" 128 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 145 endif 146 147 syn match markdownEscape "\\[][\\`*_{}()<>#+.!-]" 148 syn match markdownError "\w\@<=_\w\@=" 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 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 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 169 hi def link markdownFootnote Typedef 170 hi def link markdownFootnoteDefinition Typedef 171 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 183 hi def link markdownItalicDelimiter markdownItalic 184 hi def link markdownBold htmlBold 185 hi def link markdownBoldDelimiter markdownBold 186 hi def link markdownBoldItalic htmlBoldItalic 187 hi def link markdownBoldItalicDelimiter markdownBoldItalic 188 hi def link markdownStrike htmlStrike 189 hi def link markdownStrikeDelimiter markdownStrike 190 hi def link markdownCodeDelimiter Delimiter 191 192 hi def link markdownEscape Special 193 hi def link markdownError Error 194 195 let b:current_syntax = "markdown" 196 if main_syntax ==# 'markdown' 197 unlet main_syntax 198 endif 199 200 " vim:set sw=2: