Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 1 | " Vim filetype plugin |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 2 | " Language: Markdown |
| 3 | " Maintainer: Tim Pope <https://github.com/tpope/vim-markdown> |
Tim Pope | 244f016 | 2023-12-28 12:50:18 -0500 | [diff] [blame] | 4 | " Last Change: 2023 Dec 28 |
Riley Bruins | 0a08306 | 2024-06-03 20:40:45 +0200 | [diff] [blame] | 5 | " 2024 May 24 by Riley Bruins <ribru17@gmail.com> ('commentstring') |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 6 | |
| 7 | if exists("b:did_ftplugin") |
| 8 | finish |
| 9 | endif |
| 10 | |
| 11 | runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 12 | |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 13 | let s:keepcpo= &cpo |
| 14 | set cpo&vim |
| 15 | |
Riley Bruins | 0a08306 | 2024-06-03 20:40:45 +0200 | [diff] [blame] | 16 | setlocal comments=fb:*,fb:-,fb:+,n:> commentstring=<!--\ %s\ --> |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 17 | setlocal formatoptions+=tcqln formatoptions-=r formatoptions-=o |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 18 | setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^\\s*[-*+]\\s\\+\\\|^\\[^\\ze[^\\]]\\+\\]:\\&^.\\{4\\} |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 19 | |
Bram Moolenaar | f1568ec | 2011-12-14 21:17:39 +0100 | [diff] [blame] | 20 | if exists('b:undo_ftplugin') |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 21 | let b:undo_ftplugin .= "|setl cms< com< fo< flp< et< ts< sts< sw<" |
Bram Moolenaar | f1568ec | 2011-12-14 21:17:39 +0100 | [diff] [blame] | 22 | else |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 23 | let b:undo_ftplugin = "setl cms< com< fo< flp< et< ts< sts< sw<" |
| 24 | endif |
| 25 | |
| 26 | if get(g:, 'markdown_recommended_style', 1) |
| 27 | setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4 |
| 28 | endif |
| 29 | |
| 30 | if !exists("g:no_plugin_maps") && !exists("g:no_markdown_maps") |
| 31 | nnoremap <silent><buffer> [[ :<C-U>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "bsW")<CR> |
| 32 | nnoremap <silent><buffer> ]] :<C-U>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "sW")<CR> |
| 33 | xnoremap <silent><buffer> [[ :<C-U>exe "normal! gv"<Bar>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "bsW")<CR> |
| 34 | xnoremap <silent><buffer> ]] :<C-U>exe "normal! gv"<Bar>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "sW")<CR> |
| 35 | let b:undo_ftplugin .= '|sil! nunmap <buffer> [[|sil! nunmap <buffer> ]]|sil! xunmap <buffer> [[|sil! xunmap <buffer> ]]' |
Bram Moolenaar | f1568ec | 2011-12-14 21:17:39 +0100 | [diff] [blame] | 36 | endif |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 37 | |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 38 | function! s:NotCodeBlock(lnum) abort |
Tim Pope | 244f016 | 2023-12-28 12:50:18 -0500 | [diff] [blame] | 39 | return synIDattr(synID(a:lnum, 1, 1), 'name') !=# 'markdownCodeBlock' |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 40 | endfunction |
| 41 | |
| 42 | function! MarkdownFold() abort |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 43 | let line = getline(v:lnum) |
| 44 | |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 45 | if line =~# '^#\+ ' && s:NotCodeBlock(v:lnum) |
| 46 | return ">" . match(line, ' ') |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 47 | endif |
| 48 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 49 | let nextline = getline(v:lnum + 1) |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 50 | if (line =~ '^.\+$') && (nextline =~ '^=\+$') && s:NotCodeBlock(v:lnum + 1) |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 51 | return ">1" |
| 52 | endif |
| 53 | |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 54 | if (line =~ '^.\+$') && (nextline =~ '^-\+$') && s:NotCodeBlock(v:lnum + 1) |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 55 | return ">2" |
| 56 | endif |
| 57 | |
| 58 | return "=" |
| 59 | endfunction |
| 60 | |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 61 | function! s:HashIndent(lnum) abort |
| 62 | let hash_header = matchstr(getline(a:lnum), '^#\{1,6}') |
| 63 | if len(hash_header) |
| 64 | return hash_header |
| 65 | else |
| 66 | let nextline = getline(a:lnum + 1) |
| 67 | if nextline =~# '^=\+\s*$' |
| 68 | return '#' |
| 69 | elseif nextline =~# '^-\+\s*$' |
| 70 | return '##' |
| 71 | endif |
| 72 | endif |
| 73 | endfunction |
| 74 | |
| 75 | function! MarkdownFoldText() abort |
| 76 | let hash_indent = s:HashIndent(v:foldstart) |
| 77 | let title = substitute(getline(v:foldstart), '^#\+\s*', '', '') |
| 78 | let foldsize = (v:foldend - v:foldstart + 1) |
| 79 | let linecount = '['.foldsize.' lines]' |
| 80 | return hash_indent.' '.title.' '.linecount |
| 81 | endfunction |
| 82 | |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 83 | if has("folding") && get(g:, "markdown_folding", 0) |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 84 | setlocal foldexpr=MarkdownFold() |
| 85 | setlocal foldmethod=expr |
Bram Moolenaar | c08ee74 | 2019-12-05 22:47:25 +0100 | [diff] [blame] | 86 | setlocal foldtext=MarkdownFoldText() |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 87 | let b:undo_ftplugin .= "|setl foldexpr< foldmethod< foldtext<" |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 88 | endif |
| 89 | |
Bram Moolenaar | 3c053a1 | 2022-10-16 13:11:12 +0100 | [diff] [blame] | 90 | let &cpo = s:keepcpo |
| 91 | unlet s:keepcpo |
| 92 | |
Bram Moolenaar | 7a32991 | 2010-05-21 12:05:36 +0200 | [diff] [blame] | 93 | " vim:set sw=2: |