mirror of
https://github.com/tpope/vim-markdown.git
synced 2025-11-11 11:23:49 -05:00
If a line begins with a word that matches one of the languages listed in `g:markdown_fenced_languages`, the line is wrongly detected as being the start of a fenced code block for that language. This commit ensures that a line is only treated as the start of fenced code block if the line begins with three or more consecutive backtick or tilde characters (with optional leading space characters).
186 lines
9.7 KiB
VimL
186 lines
9.7 KiB
VimL
" 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
|
|
|
|
if has('folding')
|
|
let s:foldmethod = &l:foldmethod
|
|
let s:foldtext = &l:foldtext
|
|
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('s:foldmethod') && s:foldmethod !=# &l:foldmethod
|
|
let &l:foldmethod = s:foldmethod
|
|
unlet s:foldmethod
|
|
endif
|
|
if exists('s:foldtext') && s:foldtext !=# &l:foldtext
|
|
let &l:foldtext = s:foldtext
|
|
unlet s:foldtext
|
|
endif
|
|
|
|
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=" \{,3}#\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
|
|
syn region markdownH2 matchgroup=markdownH2Delimiter start=" \{,3}##\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
|
|
syn region markdownH3 matchgroup=markdownH3Delimiter start=" \{,3}###\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
|
|
syn region markdownH4 matchgroup=markdownH4Delimiter start=" \{,3}####\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
|
|
syn region markdownH5 matchgroup=markdownH5Delimiter start=" \{,3}#####\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
|
|
syn region markdownH6 matchgroup=markdownH6Delimiter start=" \{,3}######\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
|
|
|
|
syn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock
|
|
|
|
syn region markdownCodeBlock start="^\n\( \{4,}\|\t\)" end="^\ze \{,3}\S.*$" keepend
|
|
|
|
" 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 markdownCodeBlock matchgroup=markdownCodeDelimiter start="^\s*\z(`\{3,\}\).*$" end="^\s*\z1\ze\s*$" keepend
|
|
syn region markdownCodeBlock matchgroup=markdownCodeDelimiter start="^\s*\z(\~\{3,\}\).*$" end="^\s*\z1\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*\z(`\{3,\}\)\s*\%({.\{-}\.\)\='.matchstr(s:type,'[^=]*').'}\=\S\@!.*$" end="^\s*\z1\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g') . s:concealends
|
|
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'.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:
|