diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2018-06-04 18:07:32 +1200 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2018-06-04 18:07:32 +1200 |
commit | d4d2e8822108943f1aadd876053c6d9e65ab1659 (patch) | |
tree | 2767142e4940ac4da7708f010d195bc20b7311b9 | |
parent | Refactor suspend_autoformat.vim, add autoload (diff) | |
download | dotfiles-d4d2e8822108943f1aadd876053c6d9e65ab1659.tar.gz dotfiles-d4d2e8822108943f1aadd876053c6d9e65ab1659.zip |
Use heuristics on Markdown to guess autoformat
-rw-r--r-- | vim/after/ftplugin/markdown/autoformat.vim | 4 | ||||
-rw-r--r-- | vim/autoload/ftplugin/markdown/autoformat.vim | 24 |
2 files changed, 28 insertions, 0 deletions
diff --git a/vim/after/ftplugin/markdown/autoformat.vim b/vim/after/ftplugin/markdown/autoformat.vim index 9a963fbb..8e476158 100644 --- a/vim/after/ftplugin/markdown/autoformat.vim +++ b/vim/after/ftplugin/markdown/autoformat.vim @@ -13,6 +13,10 @@ if exists('b:undo_ftplugin') \ . '|unlet b:did_ftplugin_markdown_autoformat' endif +" Turn on autoformatting if the buffer has no code-block lines with spaces +" that is longer than 'textwidth' +call ftplugin#markdown#autoformat#Load() + " Suspend auto-formatting when in a code block (four-space indent) autocmd BufWinEnter,CursorMoved,CursorMovedI,WinEnter \ <buffer> diff --git a/vim/autoload/ftplugin/markdown/autoformat.vim b/vim/autoload/ftplugin/markdown/autoformat.vim index 1d01c58e..f416da77 100644 --- a/vim/autoload/ftplugin/markdown/autoformat.vim +++ b/vim/autoload/ftplugin/markdown/autoformat.vim @@ -13,6 +13,30 @@ function! ftplugin#markdown#autoformat#Line() abort 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 |