markdown.vim 7.9 KB

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