" Extra configuration for mail messages if &filetype !=# 'mail' || &compatible || v:version < 700 finish endif " If something hasn't already moved the cursor, we'll move to an optimal point " to start writing if line('.') == 1 && col('.') == 1 " Start by trying to move to the first quoted line; this may fail if there's " no quote, which is fine call search('\m^>', 'c') " Check this line to see if it's a generic hello-name greeting that we can " just strip out; delete the following line too, if it's blank if getline('.') =~? '^>\s*\%($' delete endif endif " Now move to the first quoted or unquoted blank line call search('\m^>\=$', 'c') endif " Add a space to the end of wrapped lines for format-flowed mail setlocal formatoptions+=w let b:undo_ftplugin .= '|setlocal formatoptions<' " Stop here if the user doesn't want ftplugin mappings if exists('g:no_plugin_maps') || exists('g:no_mail_maps') finish endif " The quote mapping in the stock plugin is a good idea, but I prefer it to " work as a motion rather than quoting to the end of the buffer nnoremap q quote#Quote() nnoremap qq quote#Quote().'_' xnoremap q quote#Quote() nnoremap Q quote#QuoteReformat() nnoremap QQ quote#QuoteReformat().'_' xnoremap Q quote#QuoteReformat() let b:undo_ftplugin .= '|nunmap q' \ . '|nunmap qq' \ . '|xunmap q' \ . '|nunmap Q' \ . '|nunmap QQ' \ . '|xunmap Q' " Flag a message as unimportant function! s:FlagUnimportant() call cursor(1, 1) call search('^$') - call append(line('.'), 'X-Priority: 5') call append(line('.'), 'Importance: Low') endfunction nnoremap \ l \ :call FlagUnimportant() let b:undo_ftplugin .= '|nunmap l' " Move through quoted paragraphs like normal-mode `{` and `}` function! s:NewBlank(start, count, up) abort " Flag for whether we've started a block let l:block = 0 " Flag for the number of blocks passed let l:blocks = 0 " Iterate through buffer lines let l:num = a:start while l:num > 0 && l:num <= line('$') " If the line is blank if getline(l:num) =~# '^[ >]*$' " If we'd moved through a non-blank block already, reset that flag and " bump up the block count if l:block let l:block = 0 let l:blocks += 1 endif " If we've hit the number of blocks, end the loop if l:blocks == a:count break endif " If the line is not blank, flag that we're going through a block else let l:block = 1 endif " Move the line number or up or down depending on direction let l:num += a:up ? -1 : 1 endwhile " Move to line (needs jumps and marks setting) execute 'normal '.l:num.'G' endfunction " Maps using NewBlank() function above for quoted paragraph movement nnoremap [ \ :call NewBlank(line('.'), v:count1, 1) nnoremap ] \ :call NewBlank(line('.'), v:count1, 0) onoremap [ \ :call NewBlank(line('.'), v:count1, 1) onoremap ] \ :call NewBlank(line('.'), v:count1, 0) let b:undo_ftplugin .= '|nunmap [' \ . '|nunmap ]' \ . '|ounmap [' \ . '|ounmap ]'