X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=95e9c98cfd952428cfa165f5c8ff16702fd95289;hp=63095ed55592842fe47e44ce49228a88f035e0f9;hb=dfb0b97b3cbc38952de39ef7d23deadf59cab731;hpb=651b215f0f6d4f220ff67941dbecd54692382472 diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index 63095ed5..95e9c98c 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -33,17 +33,17 @@ let s:notmuch_defaults = { \ 'g:notmuch_show_fold_bodies': 0 , \ 'g:notmuch_show_fold_headers': 1 , \ - \ 'g:notmuch_show_message_begin_regexp': '^ message{' , - \ 'g:notmuch_show_message_end_regexp': '^ message}' , - \ 'g:notmuch_show_header_begin_regexp': '^ header{' , - \ 'g:notmuch_show_header_end_regexp': '^ header}' , - \ 'g:notmuch_show_body_begin_regexp': '^ body{' , - \ 'g:notmuch_show_body_end_regexp': '^ body}' , - \ 'g:notmuch_show_attachment_begin_regexp': '^ attachment{' , - \ 'g:notmuch_show_attachment_end_regexp': '^ attachment}' , - \ 'g:notmuch_show_part_begin_regexp': '^ part{' , - \ 'g:notmuch_show_part_end_regexp': '^ part}' , - \ 'g:notmuch_show_marker_regexp': '^ \\(message\\|header\\|body\\|attachment\\|part\\)[{}].*$', + \ 'g:notmuch_show_message_begin_regexp': ' message{' , + \ 'g:notmuch_show_message_end_regexp': ' message}' , + \ 'g:notmuch_show_header_begin_regexp': ' header{' , + \ 'g:notmuch_show_header_end_regexp': ' header}' , + \ 'g:notmuch_show_body_begin_regexp': ' body{' , + \ 'g:notmuch_show_body_end_regexp': ' body}' , + \ 'g:notmuch_show_attachment_begin_regexp': ' attachment{' , + \ 'g:notmuch_show_attachment_end_regexp': ' attachment}' , + \ 'g:notmuch_show_part_begin_regexp': ' part{' , + \ 'g:notmuch_show_part_end_regexp': ' part}' , + \ 'g:notmuch_show_marker_regexp': ' \\(message\\|header\\|body\\|attachment\\|part\\)[{}].*$', \ \ 'g:notmuch_show_message_parse_regexp': '\(id:[^ ]*\) depth:\([0-9]*\) match:\([0-9]*\) filename:\(.*\)$', \ 'g:notmuch_show_tags_regexp': '(\([^)]*\))$' , @@ -175,7 +175,7 @@ let g:notmuch_compose_imaps = { function! s:NM_cmd_folders(words) if len(a:words) - echoe 'Not exapecting any arguments for folders command.' + throw 'Not exapecting any arguments for folders command.' endif let cmd = ['count'] let disp = [] @@ -387,7 +387,6 @@ function! s:NM_search_thread_id() if len(b:nm_raw_lines) <= mnum return '' endif - echo 'len=' . string(len(b:nm_raw_lines)) . ' mnum=' . string(mnum) let info = b:nm_raw_lines[mnum] let what = split(info, '\s\+')[0] return what @@ -539,7 +538,7 @@ function! s:NM_show_advance_marking_read_and_archiving() let msg_top = NM_show_get_message_for_line(vis_top) if !has_key(msg_top,'id') - echo "No top visible message." + throw "No top visible message." endif " if the top message is the last message, just expunge the entire thread and move on @@ -562,7 +561,7 @@ function! s:NM_show_advance_marking_read_and_archiving() let msg_bot = NM_show_get_message_for_line(vis_bot) if !has_key(msg_bot,'id') - echo "No bottom visible message." + throw "No bottom visible message." endif " if entire message fits on the screen, read/archive it, move to the next one @@ -936,6 +935,7 @@ function! s:NM_cmd_compose(words, body_lines) call NM_newFileBuffer(g:notmuch_compose_temp_file_dir, '%s.mail', \ 'compose', lines) setlocal bufhidden=hide + let b:nm_prev_bufnr = prev_bufnr call NM_set_map('n', g:notmuch_compose_nmaps) call NM_set_map('i', g:notmuch_compose_imaps) @@ -948,7 +948,99 @@ function! s:NM_cmd_compose(words, body_lines) endfunction function! s:NM_compose_send() - echo 'not implemented' + call 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 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() @@ -958,7 +1050,6 @@ endfunction function! s:NM_compose_next_entry_area() let lnum = line('.') let hdr_end = NM_compose_find_line_match(1,'^$',1) - echo 'header end = ' . string(hdr_end) if lnum < hdr_end let lnum = lnum + 1 let line = getline(lnum) @@ -1044,6 +1135,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) @@ -1131,8 +1229,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 to quit." endif @@ -1150,7 +1249,7 @@ endfunction function! s:NM_add_remove_tags(filter, prefix, tags) let filter = len(a:filter) ? a:filter : [NM_search_thread_id()] if !len(filter) - echoe 'Eeek! I couldn''t find the thead id!' + throw 'Eeek! I couldn''t find the thead id!' endif call map(a:tags, 'a:prefix . v:val') let args = ['tag'] @@ -1169,7 +1268,7 @@ function! s:NM_add_remove_tags_on_screen(online, prefix, tags) endfor else for tagname in a:tags - exec printf('silent! %ss/(\([^)]*\)\([^)]*\))$/(\1 %s)/', string(a:online), tagname) + exec printf('silent! %ss/(\([^)]*\))$/(\1 %s)/', string(a:online), tagname) endfor endif setlocal nomodifiable