aboutsummaryrefslogtreecommitdiff
path: root/vim/autoload/ftplugin/markdown/autoformat.vim
blob: f416da77e883263824ca591d81dc79b2f780b220 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
" Autoload functions for after/ftplugin/markdown/autoformat.vim

" Suspend auto-format when pasting anything with a linebreak
function! ftplugin#markdown#autoformat#Line() abort
  if getline('.') =~# '\m^    '
    if &formatoptions =~# '\ma'
      setlocal formatoptions-=a
      let b:markdown_autoformat_suspended = 1
    endif
  elseif exists('b:markdown_autoformat_suspended')
    setlocal formatoptions+=a
    unlet b:markdown_autoformat_suspended
  endif
endfunction

" Turn on autoformatting if less than 5% of the buffer's lines meet all three
" of these conditions:
"   * Longer than 'textwidth'
"   * Contains at least one space (not an unsplittable line)
"   * Not a code block (indented with at least four spaces)
function! ftplugin#markdown#autoformat#Load() abort
  let l:width = &textwidth ? &textwidth : 79
  let l:count = 0
  let l:total = line('$')
  for l:li in range(1, l:total)
    let l:line = getline(l:li)
    if strlen(l:line) > l:width
          \ && stridx(l:line, ' ') > -1
          \ && l:line !~# '\m^    '
      let l:count = l:count + 1
    endif
  endfor
  if l:count * 100 / l:total < 5
    setlocal formatoptions+=a
  else
    setlocal formatoptions-=a
  endif
endfunction

" Suspend auto-formatting when in a code block (four-space indent)
function! ftplugin#markdown#autoformat#Put(above) abort
  let l:suspended = 0
  if &formatoptions =~# '\ma' && @" =~# '\m\n'
    setlocal formatoptions-=a
    let l:suspended = 1
  endif
  if a:above
    normal! P
  else
    normal! p
  endif
  if l:suspended
    setlocal formatoptions+=a
  endif
endfunction

" Wrapper functions for #Put() above/below
function! ftplugin#markdown#autoformat#PutAbove() abort
  call ftplugin#markdown#autoformat#Put(1)
endfunction
function! ftplugin#markdown#autoformat#PutBelow() abort
  call ftplugin#markdown#autoformat#Put(0)
endfunction