diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2018-06-04 22:44:54 +1200 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2018-06-04 22:44:54 +1200 |
commit | 9d54f2b9d9246d4ad35172745d68d17290eeb840 (patch) | |
tree | 36fa4859d69e56e0612d2449d6ee0881e2e5d16a /vim/ftplugin/markdown/autoformat.vim | |
parent | Merge branch 'release/v0.45.0' (diff) | |
parent | Bump VERSION (diff) | |
download | dotfiles-9d54f2b9d9246d4ad35172745d68d17290eeb840.tar.gz dotfiles-9d54f2b9d9246d4ad35172745d68d17290eeb840.zip |
Merge branch 'release/v0.46.0'v0.46.0
* release/v0.46.0:
Bump VERSION
Use correct function for function existence check
Move Markdown and PHP ftplugins from after dir
Make private copy of ftplugin/markdown.vim
Correct a comment in ftplugin/php.vim
Diffstat (limited to 'vim/ftplugin/markdown/autoformat.vim')
-rw-r--r-- | vim/ftplugin/markdown/autoformat.vim | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/vim/ftplugin/markdown/autoformat.vim b/vim/ftplugin/markdown/autoformat.vim new file mode 100644 index 00000000..80bd034c --- /dev/null +++ b/vim/ftplugin/markdown/autoformat.vim @@ -0,0 +1,96 @@ +" Only do this when not done yet for this buffer +" Also do nothing if 'compatible' enabled, or if no autocmd feature, or if Vim +" is too old to support the needed autocmd events +if exists('b:did_ftplugin_markdown_autoformat') || &compatible + finish +endif +if !has('autocmd') || v:version < 700 + finish +endif +let b:did_ftplugin_markdown_autoformat = 1 +if exists('b:undo_ftplugin') + let b:undo_ftplugin = b:undo_ftplugin + \ . '|unlet b:did_ftplugin_markdown_autoformat' +endif + +" 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) +if !exists('*s:Load') + function! s: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 +endif +call s:Load() + +" Suspend auto-formatting when in a code block (four-space indent) +if !exists('*s:Line') + function! s: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 +endif +augroup ftplugin_markdown_autoformat + autocmd! + autocmd BufWinEnter,CursorMoved,CursorMovedI,WinEnter + \ <buffer> + \ call s:Line() +augroup END + +" Suspend auto-format when pasting anything with a linebreak +if !exists('*s:Put') + function! s:Put(above) abort + let l:suspended = 0 + if &formatoptions =~# '\ma' && getreg() =~# '\m\n' + setlocal formatoptions-=a + let l:suspended = 1 + endif + if a:above + execute 'normal! "'.v:register.v:count1.'P' + else + execute 'normal! "'.v:register.v:count1.'p' + endif + if l:suspended + setlocal formatoptions+=a + endif + endfunction +endif +nnoremap <buffer> <silent> + \ p + \ :<C-u>call <SID>Put(0)<CR> +nnoremap <buffer> <silent> + \ P + \ :<C-u>call <SID>Put(1)<CR> + +" Undo all the above +if exists('b:undo_ftplugin') + let b:undo_ftplugin = b:undo_ftplugin + \ . '|setlocal formatoptions<' + \ . '|augroup ftplugin_markdown_autoformat' + \ . '|autocmd! * <buffer>' + \ . '|augroup END' +endif |