aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2018-06-04 18:07:32 +1200
committerTom Ryder <tom@sanctum.geek.nz>2018-06-04 18:07:32 +1200
commitd4d2e8822108943f1aadd876053c6d9e65ab1659 (patch)
tree2767142e4940ac4da7708f010d195bc20b7311b9
parentRefactor suspend_autoformat.vim, add autoload (diff)
downloaddotfiles-d4d2e8822108943f1aadd876053c6d9e65ab1659.tar.gz
dotfiles-d4d2e8822108943f1aadd876053c6d9e65ab1659.zip
Use heuristics on Markdown to guess autoformat
-rw-r--r--vim/after/ftplugin/markdown/autoformat.vim4
-rw-r--r--vim/autoload/ftplugin/markdown/autoformat.vim24
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