aboutsummaryrefslogtreecommitdiff
path: root/vim/after/ftplugin/markdown
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2018-06-05 13:09:23 +1200
committerTom Ryder <tom@sanctum.geek.nz>2018-06-05 13:09:23 +1200
commitaa288d9289bc57e44cbb1f50a74c38de63d639ad (patch)
treecf46ba4690f31f591e796ba0fb7a1e233a28b672 /vim/after/ftplugin/markdown
parentAdd ftplugin infrastructure and comments (diff)
downloaddotfiles-aa288d9289bc57e44cbb1f50a74c38de63d639ad.tar.gz
dotfiles-aa288d9289bc57e44cbb1f50a74c38de63d639ad.zip
Restore ftplugin extras to vim/after dir
This reverts commit a14bc50. Changed my mind; decided it's tidier this way.
Diffstat (limited to 'vim/after/ftplugin/markdown')
-rw-r--r--vim/after/ftplugin/markdown/autoformat.vim108
-rw-r--r--vim/after/ftplugin/markdown/spell.vim21
2 files changed, 129 insertions, 0 deletions
diff --git a/vim/after/ftplugin/markdown/autoformat.vim b/vim/after/ftplugin/markdown/autoformat.vim
new file mode 100644
index 00000000..aa805267
--- /dev/null
+++ b/vim/after/ftplugin/markdown/autoformat.vim
@@ -0,0 +1,108 @@
+"
+" markdown/autoformat.vim: Refine control over the 'formatoptions' flag 'a'
+" for automatic formatting when editing Markdown documents:
+"
+" - Turn it on automatically on load if the buffer looks wrapped
+" - Suspend it if editing a line in a code block (indented by four spaces)
+" - Suspend it if pasting something with a linebreak
+"
+" Author: Tom Ryder <tom@sanctum.geek.nz>
+" License: Same as Vim itself
+"
+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 += 1
+ endif
+ endfor
+ if l:count * 100 / l:total < 5
+ setlocal formatoptions+=a
+ else
+ setlocal formatoptions-=a
+ endif
+ endfunction
+endif
+if !exists('g:markdown_autoformat_load') || g:markdown_autoformat_load
+ call s:Load()
+endif
+
+" 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
+if !exists('g:markdown_autoformat_line') || g:markdown_autoformat_line
+ augroup ftplugin_markdown_autoformat
+ autocmd!
+ autocmd BufWinEnter,CursorMoved,CursorMovedI,WinEnter
+ \ <buffer>
+ \ call s:Line()
+ augroup END
+endif
+
+" Suspend auto-format when pasting anything with a linebreak
+if !exists('*s:Put')
+ function! s:Put(key) abort
+ let l:suspended = 0
+ if &formatoptions =~# '\ma' && getreg() =~# '\m\n'
+ setlocal formatoptions-=a
+ let l:suspended = 1
+ endif
+ execute 'normal! "'.v:register.v:count1.a:key
+ if l:suspended
+ setlocal formatoptions+=a
+ endif
+ endfunction
+endif
+if !exists('g:markdown_autoformat_put') || g:markdown_autoformat_put
+ nnoremap <buffer> <silent>
+ \ p
+ \ :<C-u>call <SID>Put('p')<CR>
+ nnoremap <buffer> <silent>
+ \ P
+ \ :<C-u>call <SID>Put('P')<CR>
+endif
+
+" 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
diff --git a/vim/after/ftplugin/markdown/spell.vim b/vim/after/ftplugin/markdown/spell.vim
new file mode 100644
index 00000000..05fc7c00
--- /dev/null
+++ b/vim/after/ftplugin/markdown/spell.vim
@@ -0,0 +1,21 @@
+" Only do this when not done yet for this buffer
+" Also do nothing if 'compatible' enabled, or if the 'spell' feature isn't
+" available
+if exists('b:did_ftplugin_markdown_spell') || &compatible
+ finish
+endif
+if !has('spell')
+ finish
+endif
+let b:did_ftplugin_markdown_spell = 1
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin = b:undo_ftplugin
+ \ . '|unlet b:did_ftplugin_markdown_spell'
+endif
+
+" Spellcheck documents by default
+setlocal spell
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin = b:undo_ftplugin
+ \ . '|setlocal spell<'
+endif