function! Title_level(lnum) let l:line = getline(a:lnum) let l:hash = matchstr(l:line, '^#*') let l:count = len(l:hash) return l:count endfunction function! Is_empty(lnum) let l:line = getline(a:lnum) if match(l:line, '^\s*$') != -1 return 1 endif return 0 endfunction function! Markdown_fold(lnum) let l:level = Title_level(a:lnum) if l:level != 0 return max([l:level - 1, 0]) endif let l:empty = Is_empty(a:lnum) if l:empty == 1 let l:next_level = Title_level(a:lnum + 1) if l:next_level != 0 return max([l:next_level - 2, 0]) endif endif let l:prev_fold = foldlevel(a:lnum - 1) " return l:prev_fold return "=" endfunction setlocal foldmethod=expr setlocal foldexpr=Markdown_fold(v:lnum)