aboutsummaryrefslogblamecommitdiff
path: root/vim/after/ftplugin/mail.vim
blob: 90278bbea12c3892c04f6a5ef52888e95111a29f (plain) (tree)
1
2
3
4
5
6
7
8
9


                                                                   
                                             
 

                                                                              
                                
 





                                



                                                                              




                                                                           
                                  




                                                                
                                        







                               


          
                                                       
                               


                                  
                                                 
            
 
                   
                                         
                                                   



                        
                                                
 

                                                                
                                                 
 
                                                                    
                                         

                              

                                                               






                                                                             

     





                                                                
                                                      
                                                     


        

                                        
                                           
                                                        
                                
                                             




                                                        

                                       
                                                        
                                           



                                       


                                                        
                                           
 
                                                              
                                         
                                                    
                                         
                                                    













                                                        
" 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'

" If something hasn't already moved the cursor, we'll move to an optimal point
" 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(<q-line1>, <q-line2>)
nnoremap <LocalLeader>s
      \ :StrictQuote<CR>
xnoremap <LocalLeader>s
      \ :StrictQuote<CR>
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')

  " Set the blank line pattern
  let b:squeeze_repeat_blanks_blank = '^[ >]*$'
  let b:undo_ftplugin .= '|unlet b:squeeze_repeat_blanks_blank'

  " If there is anything quoted in this message (i.e. it looks like a reply),
  " squeeze blanks, but don't report lines deleted
  if search('\m^>', 'cnw')
    silent SqueezeRepeatBlanks
  endif

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 <buffer> <LocalLeader>h
      \ :<C-U>call mail#FlagImportant()<CR>
let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>h'
nnoremap <buffer> <LocalLeader>l
      \ :<C-U>call mail#FlagUnimportant()<CR>
let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>l'

" Quote operator
nnoremap <buffer> <expr> <LocalLeader>q
      \ quote#Quote()
xnoremap <buffer> <expr> <LocalLeader>q
      \ quote#Quote()
let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>q'
      \ . '|xunmap <buffer> <LocalLeader>q'

" Quote operator with reformatting
nnoremap <buffer> <expr> <LocalLeader>Q
      \ quote#QuoteReformat()
xnoremap <buffer> <expr> <LocalLeader>Q
      \ quote#QuoteReformat()
let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>Q'
      \ . '|xunmap <buffer> <LocalLeader>Q'

" Maps using autoloaded function for quoted paragraph movement
nnoremap <buffer> <silent> <LocalLeader>[
      \ :<C-U>call mail#NewBlank(v:count1, 1, 0)<CR>
nnoremap <buffer> <silent> <LocalLeader>]
      \ :<C-U>call mail#NewBlank(v:count1, 0, 0)<CR>
onoremap <buffer> <silent> <LocalLeader>[
      \ :<C-U>call mail#NewBlank(v:count1, 1, 0)<CR>
onoremap <buffer> <silent> <LocalLeader>]
      \ :<C-U>call mail#NewBlank(v:count1, 0, 0)<CR>
xnoremap <buffer> <silent> <LocalLeader>[
      \ :<C-U>call mail#NewBlank(v:count1, 1, 1)<CR>
xnoremap <buffer> <silent> <LocalLeader>]
      \ :<C-U>call mail#NewBlank(v:count1, 0, 1)<CR>
let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>['
      \ . '|nunmap <buffer> <LocalLeader>]'
      \ . '|ounmap <buffer> <LocalLeader>['
      \ . '|ounmap <buffer> <LocalLeader>]'
      \ . '|xunmap <buffer> <LocalLeader>['
      \ . '|xunmap <buffer> <LocalLeader>]'