neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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: