123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- " Vim syntax file
- " Language: Markdown
- " Maintainer: Tim Pope <vimNOSPAM@tpope.org>
- " Filenames: *.markdown
- " Last Change: 2020 Jan 14
- if exists("b:current_syntax")
- finish
- endif
- if !exists('main_syntax')
- let main_syntax = 'markdown'
- endif
- runtime! syntax/html.vim
- unlet! b:current_syntax
- if !exists('g:markdown_fenced_languages')
- let g:markdown_fenced_languages = []
- endif
- let s:done_include = {}
- for s:type in map(copy(g:markdown_fenced_languages),'matchstr(v:val,"[^=]*$")')
- if has_key(s:done_include, matchstr(s:type,'[^.]*'))
- continue
- endif
- if s:type =~ '\.'
- let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*')
- endif
- exe 'syn include @markdownHighlight'.substitute(s:type,'\.','','g').' syntax/'.matchstr(s:type,'[^.]*').'.vim'
- unlet! b:current_syntax
- let s:done_include[matchstr(s:type,'[^.]*')] = 1
- endfor
- unlet! s:type
- unlet! s:done_include
- if !exists('g:markdown_minlines')
- let g:markdown_minlines = 50
- endif
- execute 'syn sync minlines=' . g:markdown_minlines
- syn case ignore
- syn match markdownValid '[<>]\c[a-z/$!]\@!' transparent contains=NONE
- syn match markdownValid '&\%(#\=\w*;\)\@!' transparent contains=NONE
- syn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock,htmlSpecialChar
- syn cluster markdownBlock contains=markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6,markdownBlockquote,markdownListMarker,markdownOrderedListMarker,markdownCodeBlock,markdownRule
- syn cluster markdownInline contains=markdownLineBreak,markdownLinkText,markdownItalic,markdownBold,markdownCode,markdownEscape,@htmlTop,markdownError,markdownValid
- syn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink
- syn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink
- syn match markdownHeadingRule "^[=-]\+$" contained
- syn region markdownH1 matchgroup=markdownH1Delimiter start="##\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
- syn region markdownH2 matchgroup=markdownH2Delimiter start="###\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
- syn region markdownH3 matchgroup=markdownH3Delimiter start="####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
- syn region markdownH4 matchgroup=markdownH4Delimiter start="#####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
- syn region markdownH5 matchgroup=markdownH5Delimiter start="######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
- syn region markdownH6 matchgroup=markdownH6Delimiter start="#######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
- syn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock
- syn region markdownCodeBlock start=" \|\t" end="$" contained
- " TODO: real nesting
- syn match markdownListMarker "\%(\t\| \{0,4\}\)[-*+]\%(\s\+\S\)\@=" contained
- syn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s\+\S\)\@=" contained
- syn match markdownRule "\* *\* *\*[ *]*$" contained
- syn match markdownRule "- *- *-[ -]*$" contained
- syn match markdownLineBreak " \{2,\}$"
- syn region markdownIdDeclaration matchgroup=markdownLinkDelimiter start="^ \{0,3\}!\=\[" end="\]:" oneline keepend nextgroup=markdownUrl skipwhite
- syn match markdownUrl "\S\+" nextgroup=markdownUrlTitle skipwhite contained
- syn region markdownUrl matchgroup=markdownUrlDelimiter start="<" end=">" oneline keepend nextgroup=markdownUrlTitle skipwhite contained
- syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+"+ end=+"+ keepend contained
- syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+'+ end=+'+ keepend contained
- syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+(+ end=+)+ keepend contained
- syn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\%(\_[^][]\|\[\_[^][]*\]\)*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart
- syn region markdownLink matchgroup=markdownLinkDelimiter start="(" end=")" contains=markdownUrl keepend contained
- syn region markdownId matchgroup=markdownIdDelimiter start="\[" end="\]" keepend contained
- syn region markdownAutomaticLink matchgroup=markdownUrlDelimiter start="<\%(\w\+:\|[[:alnum:]_+-]\+@\)\@=" end=">" keepend oneline
- let s:concealends = ''
- if has('conceal') && get(g:, 'markdown_syntax_conceal', 1) == 1
- let s:concealends = ' concealends'
- endif
- exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" skip="\\\*" contains=markdownLineStart,@Spell' . s:concealends
- exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\w\@<!_\S\@=" end="\S\@<=_\w\@!" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends
- exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" skip="\\\*" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends
- exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\w\@<!__\S\@=" end="\S\@<=__\w\@!" skip="\\_" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends
- exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" skip="\\\*" contains=markdownLineStart,@Spell' . s:concealends
- exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\w\@<!___\S\@=" end="\S\@<=___\w\@!" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends
- syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart
- syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart
- syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*````*.*$" end="^\s*````*\ze\s*$" keepend
- syn match markdownFootnote "\[^[^\]]\+\]"
- syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:"
- if main_syntax ==# 'markdown'
- let s:done_include = {}
- for s:type in g:markdown_fenced_languages
- if has_key(s:done_include, matchstr(s:type,'[^.]*'))
- continue
- endif
- 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
- let s:done_include[matchstr(s:type,'[^.]*')] = 1
- endfor
- unlet! s:type
- unlet! s:done_include
- endif
- syn match markdownEscape "\\[][\\`*_{}()<>#+.!-]"
- syn match markdownError "\w\@<=_\w\@="
- hi def link markdownH1 htmlH1
- hi def link markdownH2 htmlH2
- hi def link markdownH3 htmlH3
- hi def link markdownH4 htmlH4
- hi def link markdownH5 htmlH5
- hi def link markdownH6 htmlH6
- hi def link markdownHeadingRule markdownRule
- hi def link markdownH1Delimiter markdownHeadingDelimiter
- hi def link markdownH2Delimiter markdownHeadingDelimiter
- hi def link markdownH3Delimiter markdownHeadingDelimiter
- hi def link markdownH4Delimiter markdownHeadingDelimiter
- hi def link markdownH5Delimiter markdownHeadingDelimiter
- hi def link markdownH6Delimiter markdownHeadingDelimiter
- hi def link markdownHeadingDelimiter Delimiter
- hi def link markdownOrderedListMarker markdownListMarker
- hi def link markdownListMarker htmlTagName
- hi def link markdownBlockquote Comment
- hi def link markdownRule PreProc
- hi def link markdownFootnote Typedef
- hi def link markdownFootnoteDefinition Typedef
- hi def link markdownLinkText htmlLink
- hi def link markdownIdDeclaration Typedef
- hi def link markdownId Type
- hi def link markdownAutomaticLink markdownUrl
- hi def link markdownUrl Float
- hi def link markdownUrlTitle String
- hi def link markdownIdDelimiter markdownLinkDelimiter
- hi def link markdownUrlDelimiter htmlTag
- hi def link markdownUrlTitleDelimiter Delimiter
- hi def link markdownItalic htmlItalic
- hi def link markdownItalicDelimiter markdownItalic
- hi def link markdownBold htmlBold
- hi def link markdownBoldDelimiter markdownBold
- hi def link markdownBoldItalic htmlBoldItalic
- hi def link markdownBoldItalicDelimiter markdownBoldItalic
- hi def link markdownCodeDelimiter Delimiter
- hi def link markdownEscape Special
- hi def link markdownError Error
- let b:current_syntax = "markdown"
- if main_syntax ==# 'markdown'
- unlet main_syntax
- endif
- " vim:set sw=2:
|