markdown.vim 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. " Vim syntax file
  2. " Language: Markdown
  3. " Maintainer: Tim Pope <vimNOSPAM@tpope.org>
  4. " Filenames: *.markdown
  5. " Last Change: 2020 Jan 14
  6. if exists("b:current_syntax")
  7. finish
  8. endif
  9. if !exists('main_syntax')
  10. let main_syntax = 'markdown'
  11. endif
  12. runtime! syntax/html.vim
  13. unlet! b:current_syntax
  14. if !exists('g:markdown_fenced_languages')
  15. let g:markdown_fenced_languages = []
  16. endif
  17. let s:done_include = {}
  18. for s:type in map(copy(g:markdown_fenced_languages),'matchstr(v:val,"[^=]*$")')
  19. if has_key(s:done_include, matchstr(s:type,'[^.]*'))
  20. continue
  21. endif
  22. if s:type =~ '\.'
  23. let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*')
  24. endif
  25. exe 'syn include @markdownHighlight'.substitute(s:type,'\.','','g').' syntax/'.matchstr(s:type,'[^.]*').'.vim'
  26. unlet! b:current_syntax
  27. let s:done_include[matchstr(s:type,'[^.]*')] = 1
  28. endfor
  29. unlet! s:type
  30. unlet! s:done_include
  31. if !exists('g:markdown_minlines')
  32. let g:markdown_minlines = 50
  33. endif
  34. execute 'syn sync minlines=' . g:markdown_minlines
  35. syn case ignore
  36. syn match markdownValid '[<>]\c[a-z/$!]\@!' transparent contains=NONE
  37. syn match markdownValid '&\%(#\=\w*;\)\@!' transparent contains=NONE
  38. syn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock,htmlSpecialChar
  39. syn cluster markdownBlock contains=markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6,markdownBlockquote,markdownListMarker,markdownOrderedListMarker,markdownCodeBlock,markdownRule
  40. syn cluster markdownInline contains=markdownLineBreak,markdownLinkText,markdownItalic,markdownBold,markdownCode,markdownEscape,@htmlTop,markdownError,markdownValid
  41. syn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink
  42. syn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink
  43. syn match markdownHeadingRule "^[=-]\+$" contained
  44. syn region markdownH1 matchgroup=markdownH1Delimiter start="##\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
  45. syn region markdownH2 matchgroup=markdownH2Delimiter start="###\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
  46. syn region markdownH3 matchgroup=markdownH3Delimiter start="####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
  47. syn region markdownH4 matchgroup=markdownH4Delimiter start="#####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
  48. syn region markdownH5 matchgroup=markdownH5Delimiter start="######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
  49. syn region markdownH6 matchgroup=markdownH6Delimiter start="#######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
  50. syn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock
  51. syn region markdownCodeBlock start=" \|\t" end="$" contained
  52. " TODO: real nesting
  53. syn match markdownListMarker "\%(\t\| \{0,4\}\)[-*+]\%(\s\+\S\)\@=" contained
  54. syn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s\+\S\)\@=" contained
  55. syn match markdownRule "\* *\* *\*[ *]*$" contained
  56. syn match markdownRule "- *- *-[ -]*$" contained
  57. syn match markdownLineBreak " \{2,\}$"
  58. syn region markdownIdDeclaration matchgroup=markdownLinkDelimiter start="^ \{0,3\}!\=\[" end="\]:" oneline keepend nextgroup=markdownUrl skipwhite
  59. syn match markdownUrl "\S\+" nextgroup=markdownUrlTitle skipwhite contained
  60. syn region markdownUrl matchgroup=markdownUrlDelimiter start="<" end=">" oneline keepend nextgroup=markdownUrlTitle skipwhite contained
  61. syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+"+ end=+"+ keepend contained
  62. syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+'+ end=+'+ keepend contained
  63. syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+(+ end=+)+ keepend contained
  64. syn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\%(\_[^][]\|\[\_[^][]*\]\)*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart
  65. syn region markdownLink matchgroup=markdownLinkDelimiter start="(" end=")" contains=markdownUrl keepend contained
  66. syn region markdownId matchgroup=markdownIdDelimiter start="\[" end="\]" keepend contained
  67. syn region markdownAutomaticLink matchgroup=markdownUrlDelimiter start="<\%(\w\+:\|[[:alnum:]_+-]\+@\)\@=" end=">" keepend oneline
  68. let s:concealends = ''
  69. if has('conceal') && get(g:, 'markdown_syntax_conceal', 1) == 1
  70. let s:concealends = ' concealends'
  71. endif
  72. exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" skip="\\\*" contains=markdownLineStart,@Spell' . s:concealends
  73. exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\w\@<!_\S\@=" end="\S\@<=_\w\@!" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends
  74. exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" skip="\\\*" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends
  75. exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\w\@<!__\S\@=" end="\S\@<=__\w\@!" skip="\\_" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends
  76. exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" skip="\\\*" contains=markdownLineStart,@Spell' . s:concealends
  77. exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\w\@<!___\S\@=" end="\S\@<=___\w\@!" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends
  78. syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart
  79. syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart
  80. syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*````*.*$" end="^\s*````*\ze\s*$" keepend
  81. syn match markdownFootnote "\[^[^\]]\+\]"
  82. syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:"
  83. if main_syntax ==# 'markdown'
  84. let s:done_include = {}
  85. for s:type in g:markdown_fenced_languages
  86. if has_key(s:done_include, matchstr(s:type,'[^.]*'))
  87. continue
  88. endif
  89. 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
  90. let s:done_include[matchstr(s:type,'[^.]*')] = 1
  91. endfor
  92. unlet! s:type
  93. unlet! s:done_include
  94. endif
  95. syn match markdownEscape "\\[][\\`*_{}()<>#+.!-]"
  96. syn match markdownError "\w\@<=_\w\@="
  97. hi def link markdownH1 htmlH1
  98. hi def link markdownH2 htmlH2
  99. hi def link markdownH3 htmlH3
  100. hi def link markdownH4 htmlH4
  101. hi def link markdownH5 htmlH5
  102. hi def link markdownH6 htmlH6
  103. hi def link markdownHeadingRule markdownRule
  104. hi def link markdownH1Delimiter markdownHeadingDelimiter
  105. hi def link markdownH2Delimiter markdownHeadingDelimiter
  106. hi def link markdownH3Delimiter markdownHeadingDelimiter
  107. hi def link markdownH4Delimiter markdownHeadingDelimiter
  108. hi def link markdownH5Delimiter markdownHeadingDelimiter
  109. hi def link markdownH6Delimiter markdownHeadingDelimiter
  110. hi def link markdownHeadingDelimiter Delimiter
  111. hi def link markdownOrderedListMarker markdownListMarker
  112. hi def link markdownListMarker htmlTagName
  113. hi def link markdownBlockquote Comment
  114. hi def link markdownRule PreProc
  115. hi def link markdownFootnote Typedef
  116. hi def link markdownFootnoteDefinition Typedef
  117. hi def link markdownLinkText htmlLink
  118. hi def link markdownIdDeclaration Typedef
  119. hi def link markdownId Type
  120. hi def link markdownAutomaticLink markdownUrl
  121. hi def link markdownUrl Float
  122. hi def link markdownUrlTitle String
  123. hi def link markdownIdDelimiter markdownLinkDelimiter
  124. hi def link markdownUrlDelimiter htmlTag
  125. hi def link markdownUrlTitleDelimiter Delimiter
  126. hi def link markdownItalic htmlItalic
  127. hi def link markdownItalicDelimiter markdownItalic
  128. hi def link markdownBold htmlBold
  129. hi def link markdownBoldDelimiter markdownBold
  130. hi def link markdownBoldItalic htmlBoldItalic
  131. hi def link markdownBoldItalicDelimiter markdownBoldItalic
  132. hi def link markdownCodeDelimiter Delimiter
  133. hi def link markdownEscape Special
  134. hi def link markdownError Error
  135. let b:current_syntax = "markdown"
  136. if main_syntax ==# 'markdown'
  137. unlet main_syntax
  138. endif
  139. " vim:set sw=2: