aboutsummaryrefslogtreecommitdiff
path: root/vim/after/ftplugin
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2018-06-04 19:11:45 +1200
committerTom Ryder <tom@sanctum.geek.nz>2018-06-04 19:11:45 +1200
commit3c7a5d27d22461144547fee3fb0d5ae02af5e8e9 (patch)
tree18a11ced1449e92152215b189115cfb413b8aef1 /vim/after/ftplugin
parentDon't load my HTML ftplugins for Markdown types (diff)
downloaddotfiles-3c7a5d27d22461144547fee3fb0d5ae02af5e8e9.tar.gz
dotfiles-3c7a5d27d22461144547fee3fb0d5ae02af5e8e9.zip
Move markdown_autoformat.vim funcs back to local
No advantage to making them autoload
Diffstat (limited to 'vim/after/ftplugin')
-rw-r--r--vim/after/ftplugin/markdown/autoformat.vim68
1 files changed, 64 insertions, 4 deletions
diff --git a/vim/after/ftplugin/markdown/autoformat.vim b/vim/after/ftplugin/markdown/autoformat.vim
index 2bb4f87c..7edcfbf6 100644
--- a/vim/after/ftplugin/markdown/autoformat.vim
+++ b/vim/after/ftplugin/markdown/autoformat.vim
@@ -13,9 +13,69 @@ if exists('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 !has('*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
+
+" Suspend auto-format when pasting anything with a linebreak
+if !has('*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
+
+" Suspend auto-formatting when in a code block (four-space indent)
+if !has('*s:Put')
+ function! s: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
+endif
+
" Turn on autoformatting if the buffer has no code-block lines with spaces
" that is longer than 'textwidth'
-call ftplugin#markdown#autoformat#Load()
+call s:Load()
" Group autocommands
augroup ftplugin_markdown_autoformat
@@ -24,17 +84,17 @@ augroup ftplugin_markdown_autoformat
" Suspend auto-formatting when in a code block (four-space indent)
autocmd BufWinEnter,CursorMoved,CursorMovedI,WinEnter
\ <buffer>
- \ call ftplugin#markdown#autoformat#Line()
+ \ call s:Line()
augroup END
" Suspend auto-format when pasting anything with a linebreak
nnoremap <buffer> <silent>
\ p
- \ :<C-u>call ftplugin#markdown#autoformat#PutBelow()<CR>
+ \ :<C-u>call <SID>Put(0)<CR>
nnoremap <buffer> <silent>
\ P
- \ :<C-u>call ftplugin#markdown#autoformat#PutAbove()<CR>
+ \ :<C-u>call <SID>Put(1)<CR>
" Undo all the above
if exists('b:undo_ftplugin')