]> git.madduck.net Git - etc/vim.git/blob - .vim/after/ftplugin/mail.vim

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

880119780e39f253702739e7f78637103ed910e4
[etc/vim.git] / .vim / after / ftplugin / mail.vim
1 setlocal textwidth=68
2 setlocal formatoptions-=o
3 setlocal formatoptions-=r
4 setlocal formatoptions-=l
5 setlocal formatoptions+=a
6 setlocal formatoptions+=w
7 setlocal formatoptions+=n
8
9 setlocal comments=n:>
10
11 "setlocal spell
12
13 augroup tsperrorinsert
14   au!
15 augroup END
16 match none /\s*$/
17 augroup listinsert
18   au!
19 augroup END
20 setlocal list
21
22 " Dynamically set format options, depending on where you are in a
23 " mail, idea from Teemu Likonen:
24 " http://groups.google.com/group/vim_use/msg/f59e5c1adc6be2b3
25
26 let s:defaults = "setlocal fo=".&fo
27 " tw=".&tw." ts=".&ts." sts=".&sts." sw=".&sw." fo=".&fo
28 execute s:defaults
29 let b:MailAreaDetect=1
30
31 nnoremap <buffer><silent> <F9> :call <SID>MailAreaDetect_Switch(0)<CR>
32 inoremap <buffer><silent> <F9> <C-\><C-O>:call <SID>MailAreaDetect_Switch(1)<CR>
33
34 function! s:MailAreaDetect_Switch(vmode)
35     if b:MailAreaDetect
36         silent call <SID>MailAreaDetect_Off()
37         let b:MailAreaDetect=0
38         echo 'MailAreaDetect Off'
39         if a:vmode
40             sleep 1
41         endif
42     else
43         silent call <SID>MailAreaDetect_On()
44         let b:MailAreaDetect=1
45         echo 'MailAreaDetect On'
46         if a:vmode
47             sleep 1
48         endif
49     endif
50 endfu
51
52 function! s:MailAreaDetect_On()
53     silent autocmd! MailAreaDetect CursorMoved,CursorMoved
54         \ <buffer> call <SID>AreaOptions()
55     let b:MailAreaDetect=1
56 endfunction
57
58 function! s:MailAreaDetect_Off()
59     silent autocmd! MailAreaDetect
60     execute s:defaults
61     let b:MailAreaDetect=0
62 endfunction
63
64 augroup MailAreaDetect
65     autocmd!
66     call <SID>MailAreaDetect_On()
67 augroup END
68
69 function! s:AreaOptions()
70     execute s:defaults
71
72     let s:synCur = synIDattr(synID(line("."),1,0),"name")
73     let s:synNext = synIDattr(synID(line(".")+1,1,0),"name")
74
75     if s:synNext =~ '^mailQuote' && s:synCur == '' && getline('.') =~ '^.'
76       " elseif getline('.') =~ '^\s*[^>]' && getline(line('.')+1) =~ '\m^\s*>'
77       setlocal fo-=a
78       "echo 'Quotation leader (fo='.&fo.')'
79     elseif s:synCur =~ '^mailQuote'
80       " elseif getline('.') =~ '\m^\s*>'
81       setlocal fo-=a
82       "echo 'Quotation (fo='.&fo.')'
83     elseif <SID>CheckArea('\m^--- .*\n^+++ ','\v(^$|\n^-- $)')
84       setlocal fo-=a fo-=w fo-=t noet
85       "echo 'Patch (fo='.&fo.')'
86     elseif s:synCur == '' && s:synNext =~ '^mailSignature'
87       " elseif getline(line('.')+1) =~ '\m^-- $'
88       setlocal fo-=a fo-=w fo-=t
89       "echo 'Last line before signature (fo='.&fo.')'
90     elseif s:synCur =~ '^mailSignature'
91       " elseif <SID>CheckArea('^-- $','^$')
92       setlocal fo-=a fo-=w fo-=t
93       "echo 'Signature (fo='.&fo.')'
94     elseif s:synCur =~ '^mail'
95       " if <SID>CheckArea('\v^From( |: ).*\n','\v^$')
96       setlocal fo-=a fo-=w fo-=t
97       "echo 'Header (fo='.&fo.')'
98     else
99       "echo 'My text (fo='.&fo.')'
100     endif
101 endfunction
102
103 function! s:CheckArea(start, end)
104     return (search(a:start,'bcnW')-line('.')) >
105         \ (search(a:end,'bnW')-line('.'))
106 endfunction
107
108 function! FixQuotes()
109   let l:i = 0
110   let l:lineNxt = getline(l:i)
111   let l:synNxt = synIDattr(synID(l:i,1,0),"name")
112   while l:i < line('$')-1
113     let l:lineCur = l:lineNxt
114     let l:synCur = l:synNxt
115     let l:lineNxt = getline(l:i+1)
116     let l:synNxt = synIDattr(synID(l:i+1,1,0),"name")
117     if l:synCur =~ '^mailQuote' && l:lineCur =~ '\w.*\S$' &&
118           \ l:synNxt =~ '^mailQuote' && l:lineNxt =~ '\w'
119       call setline(l:i, l:lineCur . ' ')
120     endif
121     let l:i += 1
122   endwhile
123 endfunction
124
125 augroup fixquotes
126   au!
127   autocmd BufWinEnter $TMPDIR/mutt-* call FixQuotes()
128 augroup END
129
130 nmap <buffer> <C-P><F1> :w<CR>:%!mailplate --keep-unknown official<CR>
131 nmap <buffer> <C-P><F2> :w<CR>:%!mailplate --keep-unknown tahi<CR>
132 nmap <buffer> <C-P><F3> :w<CR>:%!mailplate --keep-unknown pmvm<CR>
133 nmap <buffer> <C-P><F4> :w<CR>:%!mailplate --keep-unknown pobox<CR>
134 nmap <buffer> <C-P><F5> :w<CR>:%!mailplate --keep-unknown debian<CR>
135 nmap <buffer> <C-P><F6> :w<CR>:%!mailplate --keep-unknown debconf<CR>
136 nmap <buffer> <C-P><F7> :w<CR>:%!mailplate --keep-unknown uniwh<CR>
137 nmap <buffer> <C-P><F8> :w<CR>:%!mailplate --keep-unknown mtfk<CR>
138 nmap <buffer> <C-P><F9> :w<CR>:%!mailplate --keep-unknown sudetia<CR>
139 nmap <buffer> <C-P><F12> :w<CR>:%!mailplate --keep-unknown private<CR>
140 nmap <buffer> <F1> :w<CR>:%!mailplate --auto --keep-unknown 2>/dev/null<CR>
141
142 " change subject line
143 " Before: Subject: old
144 " After : Subject: New (was: old)
145 " http://strcat.de/wiki/dotfiles#vim
146 " map ,sw 1G/^Subject: <CR>:s/Re:/was:/<CR>Wi (<C-O>$)<ESC>0Whi
147 map <Leader>ns 1G/^Subject: /<CR>:s,\(Subject: \)\(Re: \)*\(.*\)$,\1 (was: \3),<CR>:set nohls<CR>f li
148
149 " Delete 'was' in the Subject.
150 " Before: Subject: New (was: old)
151 " After : Subject: New
152 " http://strcat.de/wiki/dotfiles#vim
153 map <Leader>dw 1G/^Subject: /<CR>:s, *(was: .*)$<CR>:set nohls<CR>f l
154
155 " http://dollyfish.net.nz/blog/2008-04-01/mutt-and-vim-custom-autocompletion
156 fun! LBDBCompleteFn(findstart, base)
157   let line = getline('.')
158   if a:findstart
159     " locate the start of the word
160     let start = col('.') - 1
161     while start > 0 && line[start - 1] =~ '[^:,]'
162       let start -= 1
163     endwhile
164     while start < col('.') && line[start] =~ '[:, ]'
165       let start += 1
166     endwhile
167     return start
168   else
169     let res = []
170     let query = substitute(a:base, '"', '', 'g')
171     let query = substitute(query, '\s*<.*>\s*', '', 'g')
172     for m in LbdbQuery(query)
173       call complete_add(printf('"%s" <%s>', escape(m[0], '"'), m[1]))
174       if complete_check()
175         break
176       endif
177     endfor
178     return res
179   endif
180 endfun
181 set completefunc=LBDBCompleteFn
182
183 " And this magic by James Vega, which ensures that we only complete with lbdb
184 " on the recipient lines of the mail header.
185 inoremap <expr> <C-n> DelegateCompletion(1)
186 inoremap <expr> <C-p> DelegateCompletion(0)
187
188 fun! DelegateCompletion(next)
189   if getline('.') =~? '^\%(To\|B\=Cc\):'
190     return "\x18\x15"
191   elseif a:next
192     return "\x0e"
193   else
194     return "\x10"
195   endif
196 endfun
197
198 autocmd BufWritePost <buffer> exe 'write ' . fnameescape((exists('$TMPDIR') ? expand('$TMPDIR') : '/tmp') . '/mail.backup.' . strftime('%Y-%m-%d-%H%M%S'))