setlocal textwidth=68
setlocal formatoptions-=o
setlocal formatoptions-=r
+setlocal formatoptions-=l
+setlocal formatoptions+=a
+setlocal formatoptions+=w
+setlocal formatoptions+=n
+
+setlocal comments=n:>
"setlocal spell
+augroup tsperrorinsert
+ au!
+augroup END
+match none /\s*$/
+augroup listinsert
+ au!
+augroup END
+setlocal list
+
" Dynamically set format options, depending on where you are in a
" mail, idea from Teemu Likonen:
" http://groups.google.com/group/vim_use/msg/f59e5c1adc6be2b3
-let d_fo = &fo
-let s:defaults = 'setlocal tw=68 ts=2 sts=2 sw=2 fo='.d_fo
+let s:defaults = "setlocal fo=".&fo
+" tw=".&tw." ts=".&ts." sts=".&sts." sw=".&sw." fo=".&fo
execute s:defaults
let b:MailAreaDetect=1
-"nnoremap <buffer> <LocalLeader>ma1 :call <SID>MailAreaDetect_On()
-" \ <bar> echo 'MailAreaDetect On'<CR>
-"nnoremap <buffer> <LocalLeader>ma0 :call <SID>MailAreaDetect_Off()
-" \ <bar> echo 'MailAreaDetect Off'<CR>
-
nnoremap <buffer><silent> <F9> :call <SID>MailAreaDetect_Switch(0)<CR>
inoremap <buffer><silent> <F9> <C-\><C-O>:call <SID>MailAreaDetect_Switch(1)<CR>
endif
endfu
-
function! s:MailAreaDetect_On()
silent autocmd! MailAreaDetect CursorMoved,CursorMoved
\ <buffer> call <SID>AreaOptions()
function! s:AreaOptions()
execute s:defaults
- if <SID>CheckArea('\v^From( |: ).*\n','\v^$')
- "echo 'Header'
- setlocal fo-=a fo-=w fo-=t sts=0 sw=2 noet
- elseif getline('.') =~ '\m^\s*>'
- "echo 'Quotation'
- setlocal fo-=a fo-=w
+
+ let s:synCur = synIDattr(synID(line("."),1,0),"name")
+ let s:synNext = synIDattr(synID(line(".")+1,1,0),"name")
+
+ if s:synNext =~ '^mailQuote' && s:synCur == '' && getline('.') =~ '^.'
+ " elseif getline('.') =~ '^\s*[^>]' && getline(line('.')+1) =~ '\m^\s*>'
+ setlocal fo-=a
+ "echo 'Quotation leader (fo='.&fo.')'
+ elseif s:synCur =~ '^mailQuote'
+ " elseif getline('.') =~ '\m^\s*>'
+ setlocal fo-=a
+ "echo 'Quotation (fo='.&fo.')'
elseif <SID>CheckArea('\m^--- .*\n^+++ ','\v(^$|\n^-- $)')
- "echo 'Patch'
- setlocal fo-=a fo-=w fo-=t sts=0 sw=2 noet
- elseif <SID>CheckArea('^-- $','^$')
- "echo 'Signature'
- setlocal fo-=a fo-=w fo-=t sts=0 sw=2 noet
+ setlocal fo-=a fo-=w fo-=t noet
+ "echo 'Patch (fo='.&fo.')'
+ elseif s:synCur == '' && s:synNext =~ '^mailSignature'
+ " elseif getline(line('.')+1) =~ '\m^-- $'
+ setlocal fo-=a fo-=w fo-=t
+ "echo 'Last line before signature (fo='.&fo.')'
+ elseif s:synCur =~ '^mailSignature'
+ " elseif <SID>CheckArea('^-- $','^$')
+ setlocal fo-=a fo-=w fo-=t
+ "echo 'Signature (fo='.&fo.')'
+ elseif s:synCur =~ '^mail'
+ " if <SID>CheckArea('\v^From( |: ).*\n','\v^$')
+ setlocal fo-=a fo-=w fo-=t
+ "echo 'Header (fo='.&fo.')'
else
- "echo 'My text'
- setlocal fo+=aw et
+ "echo 'My text (fo='.&fo.')'
endif
endfunction
\ (search(a:end,'bnW')-line('.'))
endfunction
-augroup tsperrorinsert
- au!
-augroup END
-match none /\s\+$/
-augroup listinsert
+function! FixQuotes()
+ let l:i = 0
+ let l:lineNxt = getline(l:i)
+ let l:synNxt = synIDattr(synID(l:i,1,0),"name")
+ while l:i < line('$')-1
+ let l:lineCur = l:lineNxt
+ let l:synCur = l:synNxt
+ let l:lineNxt = getline(l:i+1)
+ let l:synNxt = synIDattr(synID(l:i+1,1,0),"name")
+ if l:synCur =~ '^mailQuote' && l:lineCur =~ '\w.*\S$' &&
+ \ l:synNxt =~ '^mailQuote' && l:lineNxt =~ '\w'
+ call setline(l:i, l:lineCur . ' ')
+ endif
+ let l:i += 1
+ endwhile
+endfunction
+
+augroup fixquotes
au!
+ autocmd BufWinEnter $TMPDIR/mutt-* call FixQuotes()
augroup END
-set nolist
+
+nmap <buffer> <C-P><F1> :w<CR>:%!mailplate --keep-unknown official<CR>
+nmap <buffer> <C-P><F2> :w<CR>:%!mailplate --keep-unknown tahi<CR>
+nmap <buffer> <C-P><F3> :w<CR>:%!mailplate --keep-unknown pmvm<CR>
+nmap <buffer> <C-P><F4> :w<CR>:%!mailplate --keep-unknown pobox<CR>
+nmap <buffer> <C-P><F5> :w<CR>:%!mailplate --keep-unknown debian<CR>
+nmap <buffer> <C-P><F6> :w<CR>:%!mailplate --keep-unknown debconf<CR>
+nmap <buffer> <C-P><F7> :w<CR>:%!mailplate --keep-unknown uniwh<CR>
+nmap <buffer> <C-P><F8> :w<CR>:%!mailplate --keep-unknown mtfk<CR>
+nmap <buffer> <C-P><F9> :w<CR>:%!mailplate --keep-unknown sudetia<CR>
+nmap <buffer> <C-P><F12> :w<CR>:%!mailplate --keep-unknown private<CR>
+nmap <buffer> <F1> :w<CR>:%!mailplate --auto --keep-unknown 2>/dev/null<CR>
+
+" change subject line
+" Before: Subject: old
+" After : Subject: New (was: old)
+" http://strcat.de/wiki/dotfiles#vim
+" map ,sw 1G/^Subject: <CR>:s/Re:/was:/<CR>Wi (<C-O>$)<ESC>0Whi
+map <Leader>ns 1G/^Subject: /<CR>:s,\(Subject: \)\(Re: \)*\(.*\)$,\1 (was: \3),<CR>:set nohls<CR>f li
+
+" Delete 'was' in the Subject.
+" Before: Subject: New (was: old)
+" After : Subject: New
+" http://strcat.de/wiki/dotfiles#vim
+map <Leader>dw 1G/^Subject: /<CR>:s, *(was: .*)$<CR>:set nohls<CR>f l
+
+" http://dollyfish.net.nz/blog/2008-04-01/mutt-and-vim-custom-autocompletion
+fun! LBDBCompleteFn(findstart, base)
+ let line = getline('.')
+ if a:findstart
+ " locate the start of the word
+ let start = col('.') - 1
+ while start > 0 && line[start - 1] =~ '[^:,]'
+ let start -= 1
+ endwhile
+ while start < col('.') && line[start] =~ '[:, ]'
+ let start += 1
+ endwhile
+ return start
+ else
+ let res = []
+ let query = substitute(a:base, '"', '', 'g')
+ let query = substitute(query, '\s*<.*>\s*', '', 'g')
+ for m in LbdbQuery(query)
+ call complete_add(printf('"%s" <%s>', escape(m[0], '"'), m[1]))
+ if complete_check()
+ break
+ endif
+ endfor
+ return res
+ endif
+endfun
+set completefunc=LBDBCompleteFn
+
+" And this magic by James Vega, which ensures that we only complete with lbdb
+" on the recipient lines of the mail header.
+inoremap <expr> <C-n> DelegateCompletion(1)
+inoremap <expr> <C-p> DelegateCompletion(0)
+
+fun! DelegateCompletion(next)
+ if getline('.') =~? '^\%(To\|B\=Cc\):'
+ return "\x18\x15"
+ elseif a:next
+ return "\x0e"
+ else
+ return "\x10"
+ endif
+endfun
+
+autocmd BufWritePost <buffer> exe 'write ' . fnameescape((exists('$TMPDIR') ? expand('$TMPDIR') : '/tmp') . '/mail.backup.' . strftime('%Y-%m-%d-%H%M%S'))