-nmap <buffer> <C-P><F1> :w<CR>:%!~/.bin/mail/mailplate --keep-unknown official<CR>
-nmap <buffer> <C-P><F2> :w<CR>:%!~/.bin/mail/mailplate --keep-unknown private<CR>
-nmap <buffer> <C-P><F3> :w<CR>:%!~/.bin/mail/mailplate --keep-unknown debian<CR>
-nmap <buffer> <C-P><F5> :w<CR>:%!~/.bin/mail/mailplate --keep-unknown ul<CR>
-nmap <buffer> <C-P><F6> :w<CR>:%!~/.bin/mail/mailplate --keep-unknown uzh<CR>
-nmap <buffer> <C-P><F9> :w<CR>:%!~/.bin/mail/mailplate --keep-unknown sudetia<CR>
-nmap <buffer> <F1> :w<CR>:%!~/.bin/mail/mailplate --auto --keep-unknown 2>/dev/null<CR>
-
-" Checking attachments in edited emails for use in Mutt: warns user when
-" exiting
-" by Hugo Haas <hugo@larve.net> - 20 June 2004
-" based on an idea by The Doctor What explained at
-" <mid:caq406$rq4$1@FreeBSD.csie.NCTU.edu.tw>
-" http://www.vim.org/scripts/download_script.php?src_id=3165
-autocmd BufUnload mutt-* call CheckAttachments()
-function! CheckAttachments()
- let l:english = 'attach\(ing\|ed\|ment\)\?\|included with this mail'
- let l:french = 'attach\(e\|er\|ée\?s\?\|ement\|ant\)'
- let l:german = 'an\(gehängt\|hängsel\|bei\)\|bei\(gefügt|lage\)\|\(im\|siehe\)\_sanhang'
- let l:ic = &ignorecase
- if (l:ic == 0)
- set ignorecase
- endif
- if (search('^\([^>|].*\)\?\<\(re-\?\)\?\('.l:english.'\|'.l:german.'\)\>', "w") != 0)
- let l:temp = inputdialog("Do you want to attach a file? [Hit return] ")
- endif
- if (l:ic == 0)
- set noignorecase
- endif
- echo
-endfunction
+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
" 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