17a329911SBram Moolenaar" Vim filetype plugin
27a329911SBram Moolenaar" Language:		Markdown
37a329911SBram Moolenaar" Maintainer:		Tim Pope <[email protected]>
4*c08ee747SBram Moolenaar" Last Change:		2019 Dec 05
57a329911SBram Moolenaar
67a329911SBram Moolenaarif exists("b:did_ftplugin")
77a329911SBram Moolenaar  finish
87a329911SBram Moolenaarendif
97a329911SBram Moolenaar
107a329911SBram Moolenaarruntime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
117a329911SBram Moolenaar
12*c08ee747SBram Moolenaarsetlocal comments=fb:*,fb:-,fb:+,n:> commentstring=<!--%s-->
13543b7ef7SBram Moolenaarsetlocal formatoptions+=tcqln formatoptions-=r formatoptions-=o
1489bcfda6SBram Moolenaarsetlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^[-*+]\\s\\+\\\|^\\[^\\ze[^\\]]\\+\\]:
157a329911SBram Moolenaar
16f1568ecaSBram Moolenaarif exists('b:undo_ftplugin')
17f1568ecaSBram Moolenaar  let b:undo_ftplugin .= "|setl cms< com< fo< flp<"
18f1568ecaSBram Moolenaarelse
19f1568ecaSBram Moolenaar  let b:undo_ftplugin = "setl cms< com< fo< flp<"
20f1568ecaSBram Moolenaarendif
217a329911SBram Moolenaar
22*c08ee747SBram Moolenaarfunction! s:NotCodeBlock(lnum) abort
23*c08ee747SBram Moolenaar  return synIDattr(synID(v:lnum, 1, 1), 'name') !=# 'markdownCode'
24*c08ee747SBram Moolenaarendfunction
25*c08ee747SBram Moolenaar
26*c08ee747SBram Moolenaarfunction! MarkdownFold() abort
2789bcfda6SBram Moolenaar  let line = getline(v:lnum)
2889bcfda6SBram Moolenaar
29*c08ee747SBram Moolenaar  if line =~# '^#\+ ' && s:NotCodeBlock(v:lnum)
30*c08ee747SBram Moolenaar    return ">" . match(line, ' ')
3189bcfda6SBram Moolenaar  endif
3289bcfda6SBram Moolenaar
3389bcfda6SBram Moolenaar  let nextline = getline(v:lnum + 1)
34*c08ee747SBram Moolenaar  if (line =~ '^.\+$') && (nextline =~ '^=\+$') && s:NotCodeBlock(v:lnum + 1)
3589bcfda6SBram Moolenaar    return ">1"
3689bcfda6SBram Moolenaar  endif
3789bcfda6SBram Moolenaar
38*c08ee747SBram Moolenaar  if (line =~ '^.\+$') && (nextline =~ '^-\+$') && s:NotCodeBlock(v:lnum + 1)
3989bcfda6SBram Moolenaar    return ">2"
4089bcfda6SBram Moolenaar  endif
4189bcfda6SBram Moolenaar
4289bcfda6SBram Moolenaar  return "="
4389bcfda6SBram Moolenaarendfunction
4489bcfda6SBram Moolenaar
45*c08ee747SBram Moolenaarfunction! s:HashIndent(lnum) abort
46*c08ee747SBram Moolenaar  let hash_header = matchstr(getline(a:lnum), '^#\{1,6}')
47*c08ee747SBram Moolenaar  if len(hash_header)
48*c08ee747SBram Moolenaar    return hash_header
49*c08ee747SBram Moolenaar  else
50*c08ee747SBram Moolenaar    let nextline = getline(a:lnum + 1)
51*c08ee747SBram Moolenaar    if nextline =~# '^=\+\s*$'
52*c08ee747SBram Moolenaar      return '#'
53*c08ee747SBram Moolenaar    elseif nextline =~# '^-\+\s*$'
54*c08ee747SBram Moolenaar      return '##'
55*c08ee747SBram Moolenaar    endif
56*c08ee747SBram Moolenaar  endif
57*c08ee747SBram Moolenaarendfunction
58*c08ee747SBram Moolenaar
59*c08ee747SBram Moolenaarfunction! MarkdownFoldText() abort
60*c08ee747SBram Moolenaar  let hash_indent = s:HashIndent(v:foldstart)
61*c08ee747SBram Moolenaar  let title = substitute(getline(v:foldstart), '^#\+\s*', '', '')
62*c08ee747SBram Moolenaar  let foldsize = (v:foldend - v:foldstart + 1)
63*c08ee747SBram Moolenaar  let linecount = '['.foldsize.' lines]'
64*c08ee747SBram Moolenaar  return hash_indent.' '.title.' '.linecount
65*c08ee747SBram Moolenaarendfunction
66*c08ee747SBram Moolenaar
6789bcfda6SBram Moolenaarif has("folding") && exists("g:markdown_folding")
6889bcfda6SBram Moolenaar  setlocal foldexpr=MarkdownFold()
6989bcfda6SBram Moolenaar  setlocal foldmethod=expr
70*c08ee747SBram Moolenaar  setlocal foldtext=MarkdownFoldText()
71*c08ee747SBram Moolenaar  let b:undo_ftplugin .= " foldexpr< foldmethod< foldtext<"
7289bcfda6SBram Moolenaarendif
7389bcfda6SBram Moolenaar
747a329911SBram Moolenaar" vim:set sw=2:
75