aboutsummaryrefslogtreecommitdiffhomepage
path: root/vim
diff options
context:
space:
mode:
authorGravatar Bart Trojanowski <bart@jukie.net>2009-11-27 01:03:35 -0500
committerGravatar Bart Trojanowski <bart@jukie.net>2009-11-27 01:03:35 -0500
commitb5e28d86153c15461f277ef1b0b827d3fe4a5fc1 (patch)
treee43bb7d4f562ce4ffc6d72464c34cbbe102075fd /vim
parent05d76deb2eb3aaf09444e8cfb59a438c3d774bea (diff)
vim: implement sending with ,s from compose buffer
Diffstat (limited to 'vim')
-rw-r--r--vim/plugin/notmuch.vim106
1 files changed, 103 insertions, 3 deletions
diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim
index 63a711fd..47a22610 100644
--- a/vim/plugin/notmuch.vim
+++ b/vim/plugin/notmuch.vim
@@ -949,7 +949,99 @@ function! s:NM_cmd_compose(words, body_lines)
endfunction
function! s:NM_compose_send()
- echo 'not implemented'
+ call <SID>NM_assert_buffer_type('compose')
+ let fname = expand('%')
+ let lnum = 1
+ let line = getline(lnum)
+ let hdrs = {}
+ let lst_hdr = ''
+ while match(line, '^$') == -1
+ if match(line, '^Notmuch-Help:') != -1
+ " skip it
+ elseif strlen(lst_hdr) && match(line, '^\s') != -1
+ let hdrs[lst_hdr][-1] = hdrs[lst_hdr][-1] . substitute(line, '^\s*', ' ', '')
+ else
+ let m = matchlist(line, '^\(\w[^:]*\):\s*\(.*\)\s*$')
+ if !len(m)
+ cursor(lnum, 0)
+ throw printf('Eeek! invalid header on line %d', lnum)
+ endif
+ let key = substitute(m[1], '\<\w', '\U&', 'g')
+ if strlen(m[2])
+ if !has_key(hdrs, key)
+ let hdrs[key] = []
+ endif
+ call add(hdrs[key], m[2])
+ endif
+ let lst_hdr = key
+ endif
+ let lnum = lnum + 1
+ let line = getline(lnum)
+ endwhile
+ let body_starts = lnum + 1
+ exec printf('0,%dd', body_starts)
+ write
+
+ "[-a header] [-b bcc-addr] [-c cc-addr] [-s subject] to-addr
+ let cmd = ['mail']
+ let tos = []
+ for [key, vals] in items(hdrs)
+ if key == 'To'
+ call extend(tos, vals)
+ elseif key == 'Bcc'
+ for adr in vals
+ call add(cmd, '-b')
+ call add(cmd, adr)
+ endfor
+ elseif key == 'Cc'
+ for adr in vals
+ call add(cmd, '-c')
+ call add(cmd, adr)
+ endfor
+ elseif key == 'Subject'
+ for txt in vals
+ call add(cmd, '-s')
+ call add(cmd, txt)
+ endfor
+ else
+ for val in vals
+ call add(cmd, '-a')
+ call add(cmd, key . ': ' . val)
+ endfor
+ endif
+ endfor
+ call extend(cmd, tos)
+
+ call map(cmd, 's:NM_shell_escape(v:val)')
+ let cmdtxt = join(cmd) . '< ' . fname
+ let out = system(cmdtxt)
+ let err = v:shell_error
+ if err
+ undo
+ write
+ call <SID>NM_newBuffer('new', 'error',
+ \ "While running...\n" .
+ \ ' ' . cmdtxt . "\n" .
+ \ "\n" .
+ \ "Failed with...\n" .
+ \ substitute(out, '^', ' ', 'g'))
+ echohl Error
+ echo 'Eeek! unable to send mail'
+ echohl None
+ return
+ endif
+
+ if !exists('b:nm_prev_bufnr')
+ bdelete
+ else
+ let prev_bufnr = b:nm_prev_bufnr
+ bdelete
+ if prev_bufnr == bufnr('%')
+ exec printf("buffer %d", prev_bufnr)
+ endif
+ endif
+ call delete(fname)
+ echo 'Mail sent successfully.'
endfunction
function! s:NM_compose_attach()
@@ -1045,6 +1137,13 @@ function! s:NM_newFileBuffer(fdir, fname, type, lines)
let b:nm_type = a:type
endfunction
+function! s:NM_assert_buffer_type(type)
+ if !exists('b:nm_type') || b:nm_type != a:type
+ throw printf('Eeek! expected type %s, but got %s.', a:type,
+ \ exists(b:nm_type) ? b:nm_type : 'something else')
+ endif
+endfunction
+
function! s:NM_mktemp(dir, name)
let time_stamp = strftime('%Y%m%d-%H%M%S')
let file_name = substitute(a:dir,'/*$','/','') . printf(a:name, time_stamp)
@@ -1132,8 +1231,9 @@ endfunction
function! s:NM_kill_this_buffer()
if exists('b:nm_prev_bufnr')
- setlocal bufhidden=delete
- exec printf(":buffer %d", b:nm_prev_bufnr)
+ let prev_bufnr = b:nm_prev_bufnr
+ bdelete
+ exec printf("buffer %d", prev_bufnr)
else
echo "This is the last buffer; use :q<CR> to quit."
endif