" Don't append spaces after quote chars, for strict compliance with " format=flowed let b:quote_space = 0 let b:undo_ftplugin .= '|unlet b:quote_space' " Attempt to move to a good spot to start writing function! s:SuggestStart() abort " Move to top of buffer call setpos('.', [0, 1, 1, 0]) " Move to body text call search('\m^$', 'c') | + " 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') " Delete quoted blank lines or quoted greetings until we get to something " with substance. Yes, I like Perl, how could you tell? while getline('.') =~? '^> *' \ . '\%(' \ . '\%(' \ . 'g[''\u2019]\=day' \ . '\|\%(good \)\=\%(morning\|afternoon\|evening\)' \ . '\|h[eu]\%(ll\|rr\)o\+' \ . '\|hey\+' \ . '\|hi\+' \ . '\|sup' \ . '\|what[''\u2019]\=s up' \ . '\|yo' \ . '\)' \ . '[[:punct:] ]*' \ . '\%(' \ . '\a\+' \ . '[[:punct:] ]*' \ . '\)\=' \ . '\)\=$' delete endwhile " Now move to the first quoted or unquoted blank line call search('\m^>\= *$', 'c') endfunction command! -bar -buffer SuggestStart \ call s:SuggestStart() let b:undo_ftplugin .= '|delcommand SuggestStart' SuggestStart " Normalise quoting command -buffer -bar -range=% StrictQuote \ call mail#StrictQuote(, ) nnoremap s \ :StrictQuote xnoremap s \ :StrictQuote let b:undo_ftplugin .= '|delcommand StrictQuote' " Add a space to the end of wrapped lines for format-flowed mail setlocal formatoptions+=w let b:undo_ftplugin .= '|setlocal formatoptions<' " Mail-specific handling for custom vim-squeeze-repeat-blanks plugin if exists('loaded_squeeze_repeat_blanks') let b:squeeze_repeat_blanks_blank = '^[ >]*$' let b:undo_ftplugin .= '|unlet b:squeeze_repeat_blanks_blank' endif " Spellcheck documents we're actually editing (not just viewing) if &modifiable && !&readonly setlocal spell let b:undo_ftplugin .= '|setlocal spell<' endif " Stop here if the user doesn't want ftplugin mappings if exists('no_plugin_maps') || exists('no_mail_maps') finish endif " Flag messages as important/unimportant nnoremap h \ :call mail#FlagImportant() let b:undo_ftplugin .= '|nunmap h' nnoremap l \ :call mail#FlagUnimportant() let b:undo_ftplugin .= '|nunmap l' " Quote operator nnoremap q \ quote#Quote() xnoremap q \ quote#Quote() let b:undo_ftplugin .= '|nunmap q' \ . '|xunmap q' " Quote operator with reformatting nnoremap Q \ quote#QuoteReformat() xnoremap Q \ quote#QuoteReformat() let b:undo_ftplugin .= '|nunmap Q' \ . '|xunmap Q' " Maps using autoloaded function for quoted paragraph movement nnoremap [ \ :call mail#NewBlank(v:count1, 1, 0) nnoremap ] \ :call mail#NewBlank(v:count1, 0, 0) onoremap [ \ :call mail#NewBlank(v:count1, 1, 0) onoremap ] \ :call mail#NewBlank(v:count1, 0, 0) xnoremap [ \ :call mail#NewBlank(v:count1, 1, 1) xnoremap ] \ :call mail#NewBlank(v:count1, 0, 1) let b:undo_ftplugin .= '|nunmap [' \ . '|nunmap ]' \ . '|ounmap [' \ . '|ounmap ]' \ . '|xunmap [' \ . '|xunmap ]'