]> 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:

Merge commit '882d8795c6ff65c02f2657e596391748d1b6b7f5'
[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 pobox<CR>
132 nmap <buffer> <C-P><F3> :w<CR>:%!mailplate --keep-unknown tahi<CR>
133 nmap <buffer> <C-P><F4> :w<CR>:%!mailplate --keep-unknown toni<CR>
134 nmap <buffer> <C-P><F5> :w<CR>:%!mailplate --keep-unknown kbkg<CR>
135
136 nmap <buffer> <C-P><F8> :w<CR>:%!mailplate --keep-unknown debian<CR>
137 nmap <buffer> <C-P><F9> :w<CR>:%!mailplate --keep-unknown uniwh<CR>
138 nmap <buffer> <C-P><F10> :w<CR>:%!mailplate --keep-unknown mtfk<CR>
139 nmap <buffer> <C-P><F11> :w<CR>:%!mailplate --keep-unknown sudetia<CR>
140 nmap <buffer> <C-P><F12> :w<CR>:%!mailplate --keep-unknown default<CR>
141 nmap <buffer> <F1> :w<CR>:%!mailplate --auto --keep-unknown 2>/dev/null<CR>
142
143 " change subject line
144 " Before: Subject: old
145 " After : Subject: New (was: old)
146 " http://strcat.de/wiki/dotfiles#vim
147 " map ,sw 1G/^Subject: <CR>:s/Re:/was:/<CR>Wi (<C-O>$)<ESC>0Whi
148 map <Leader>ns 1G/^Subject: /<CR>:s,\(Subject: \)\(Re: \)*\(.*\)$,\1 (was: \3),<CR>:set nohls<CR>f li
149
150 " Delete 'was' in the Subject.
151 " Before: Subject: New (was: old)
152 " After : Subject: New
153 " http://strcat.de/wiki/dotfiles#vim
154 map <Leader>dw 1G/^Subject: /<CR>:s, *(was: .*)$<CR>:set nohls<CR>f l
155
156 " http://dollyfish.net.nz/blog/2008-04-01/mutt-and-vim-custom-autocompletion
157 fun! LBDBCompleteFn(findstart, base)
158   let line = getline('.')
159   if a:findstart
160     " locate the start of the word
161     let start = col('.') - 1
162     while start > 0 && line[start - 1] =~ '[^:,]'
163       let start -= 1
164     endwhile
165     while start < col('.') && line[start] =~ '[:, ]'
166       let start += 1
167     endwhile
168     return start
169   else
170     let res = []
171     let query = substitute(a:base, '"', '', 'g')
172     let query = substitute(query, '\s*<.*>\s*', '', 'g')
173     for m in LbdbQuery(query)
174       call complete_add(printf('"%s" <%s>', escape(m[0], '"'), m[1]))
175       if complete_check()
176         break
177       endif
178     endfor
179     return res
180   endif
181 endfun
182 set completefunc=LBDBCompleteFn
183
184 " And this magic by James Vega, which ensures that we only complete with lbdb
185 " on the recipient lines of the mail header.
186 inoremap <expr> <C-n> DelegateCompletion(1)
187 inoremap <expr> <C-p> DelegateCompletion(0)
188
189 fun! DelegateCompletion(next)
190   if getline('.') =~? '^\%(To\|B\=Cc\):'
191     return "\x18\x15"
192   elseif a:next
193     return "\x0e"
194   else
195     return "\x10"
196   endif
197 endfun
198
199 function! WriteMailBackup()
200     let l:tmpdir = fnameescape((exists('$TMPDIR') ? expand('$TMPDIR') : '/tmp'))
201     let l:tgtdir = l:tmpdir . '/mail-backups'
202     call mkdir(l:tgtdir, "p", 0o700)
203     let l:modified = &modified
204     let l:filename = l:tgtdir . '/' . strftime('%Y-%m-%d-%H%M%S') . '.msg'
205     exe 'silent update! ' . l:filename
206     if 0 && l:modified
207       echo 'Backup written to ' . l:filename
208     endif
209 endfunction
210 autocmd BufWritePre <buffer> call WriteMailBackup()
211
212 let g:markdown_in_mail = 1
213 runtime! ftplugin/markdown.vim