X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=6b82abedbfe2b9a655021bd6e7d99735f25356fa;hp=a9754f2b4b2e94de332931806260323ff674bfaa;hb=e7899b00d0948f5d8e75b22b9ce82037593ebcdd;hpb=2805a243b5564bb99196923f96118ace4c55e870 diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index a9754f2b..6b82abed 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -18,11 +18,14 @@ " along with Notmuch. If not, see . " " Authors: Bart Trojanowski - +" Contributors: Felipe Contreras , +" Peter Hartman +" " --- configuration defaults {{{1 let s:notmuch_defaults = { \ 'g:notmuch_cmd': 'notmuch' , + \ 'g:notmuch_sendmail': 'sendmail' , \ 'g:notmuch_debug': 0 , \ \ 'g:notmuch_search_newest_first': 1 , @@ -118,6 +121,7 @@ let g:notmuch_search_maps = { \ '': ':call NM_search_show_thread(1)', \ '': ':call NM_search_expand('''')', \ 'a': ':call NM_search_archive_thread()', + \ 'A': ':call NM_search_mark_read_then_archive_thread()', \ 'f': ':call NM_search_filter()', \ 'm': ':call NM_new_mail()', \ 'o': ':call NM_search_toggle_order()', @@ -243,26 +247,23 @@ function! s:NM_cmd_search(words) let b:nm_raw_lines = lines let b:nm_search_words = a:words - call NM_cmd_search_mksyntax() call NM_set_map('n', g:notmuch_search_maps) setlocal cursorline setlocal nowrap endfunction function! s:NM_cmd_search_fmtline(line) - let m = matchlist(a:line, '^\(thread:\S\+\)\s\([^]]\+\]\) \([^;]\+\); \(.*\) (\([^(]*\))$') + let m = matchlist(a:line, '^\(thread:\S\+\)\s\(.\{12\}\) \[\(\d\+\)/\d\+\] \([^;]\+\); \%(\[[^\[]\+\] \)*\(.*\) (\([^(]*\))$') if !len(m) return 'ERROR PARSING: ' . a:line endif let max = g:notmuch_search_from_column_width - let from = m[3] - if strlen(from) >= max - let from = substitute(m[3][0:max-4], '[^A-Za-z1-9_]*$', '', '') . '...' - endif - return printf('%-20s %-20s | %s (%s)', m[2], from, m[4], m[5]) -endfunction -function! s:NM_cmd_search_mksyntax() - syntax clear nmSearchFrom - exec printf('syntax match nmSearchFrom /\(\] \)\@<=.\{%d\}/ oneline contained', g:notmuch_search_from_column_width) + let flist = [] + for at in split(m[4], ", ") + let p = min([stridx(at, "."), stridx(at, "@")]) + call insert(flist, tolower(at[0:p - 1])) + endfor + let from = join(flist, ", ") + return printf("%-12s %3s %-20.20s | %s (%s)", m[2], m[3], from, m[5], m[6]) endfunction " --- --- search screen action functions {{{2 @@ -309,8 +310,12 @@ function! s:NM_search_edit() endfunction function! s:NM_search_archive_thread() - call NM_add_remove_tags_on_screen('', '-', ['inbox']) - call NM_add_remove_tags([], '-', ['inbox']) + call NM_tag([], ['-inbox']) + norm j +endfunction + +function! s:NM_search_mark_read_then_archive_thread() + call NM_tag([], ['-unread', '-inbox']) norm j endfunction @@ -401,8 +406,8 @@ function! s:NM_search_add_remove_tags(prompt, prefix, intags) else let tags = a:intags endif - call NM_add_remove_tags([], a:prefix, tags) - call NM_add_remove_tags_on_screen('', a:prefix, tags) + call map(tags, 'a:prefix . v:val') + call NM_tag([], tags) endfunction " --- implement show screen {{{1 @@ -492,11 +497,13 @@ function! s:NM_show_next_thread() endfunction function! s:NM_show_archive_thread() - echo 'not implemented' + call NM_tag(b:nm_search_words, ['-inbox']) + call NM_show_next_thread() endfunction function! s:NM_show_mark_read_then_archive_thread() - echo 'not implemented' + call NM_tag(b:nm_search_words, ['-unread', '-inbox']) + call NM_show_next_thread() endfunction function! s:NM_show_mark_read_then_next_open_message() @@ -559,7 +566,8 @@ function! s:NM_show_advance_marking_read_and_archiving() let filter = NM_combine_tags('tag:', advance_tags, 'OR', '()') \ + ['AND'] \ + NM_combine_tags('', ids, 'OR', '()') - call NM_add_remove_tags(filter, '-', advance_tags) + call map(advance_tags, '"+" . v:val') + call NM_tag(filter, advance_tags) call NM_show_next(1, 1) return endif @@ -571,7 +579,6 @@ function! s:NM_show_advance_marking_read_and_archiving() " if entire message fits on the screen, read/archive it, move to the next one if msg_top['id'] != msg_bot['id'] || msg_top['end'] <= vis_bot - call NM_add_remove_tags_on_screen(msg_top['start'], '-', advance_tags) exec printf('norm %dG', vis_top) call NM_show_next(0, 1) if has_key(msg_top,'match') && msg_top['match'] != '0' @@ -579,7 +586,8 @@ function! s:NM_show_advance_marking_read_and_archiving() " do this last to hide the latency let filter = NM_combine_tags('tag:', advance_tags, 'OR', '()') \ + ['AND', msg_top['id']] - call NM_add_remove_tags(filter, '-', advance_tags) + call map(advance_tags, '"-" . v:val') + call NM_tag(filter, advance_tags) endif return endif @@ -940,71 +948,21 @@ function! s:NM_compose_send() 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 + if !exists("hdr_starts") && match(line, '^Notmuch-Help:') == -1 + let hdr_starts = lnum - 1 endif let lnum = lnum + 1 let line = getline(lnum) endwhile - let body_starts = lnum - - "[-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) + let body_starts = lnum - 1 - " TODO: make sure we have at least one target - " TODO: ask about empty jubject, etc - - exec printf('0,%dd', body_starts) + call append(body_starts, 'Date: ' . strftime('%a, %d %b %Y %H:%M:%S %z')) + exec printf(':0,%dd', hdr_starts) write - call map(cmd, 's:NM_shell_escape(v:val)') - let cmdtxt = join(cmd) . '< ' . fname + let cmdtxt = g:notmuch_sendmail . ' -t < ' . fname let out = system(cmdtxt) let err = v:shell_error if err @@ -1074,11 +1032,9 @@ endfunction " --- --- compose screen helper functions {{{2 function! s:NM_compose_get_user_email() - let name = substitute(system('id -u -n'), '\v(^\s*|\s*$|\n)', '', 'g') - let fqdn = substitute(system('hostname -f'), '\v(^\s*|\s*$|\n)', '', 'g') - - " TODO: do this properly - return name . '@' . fqdn + " TODO: do this properly (still), i.e., allow for multiple email accounts + let email = substitute(system('notmuch config get user.primary_email'), '\v(^\s*|\s*$|\n)', '', 'g') + return email endfunction function! s:NM_compose_find_line_match(start, pattern, failure) @@ -1236,13 +1192,16 @@ function! s:NM_run(args) call map(words, 's:NM_shell_escape(v:val)') let cmd = g:notmuch_cmd . ' ' . join(words) . '< /dev/null' - let start = reltime() - let out = system(cmd) - let err = v:shell_error - let delta = reltime(start) - if exists('g:notmuch_debug') && g:notmuch_debug + let start = reltime() + let out = system(cmd) + let err = v:shell_error + let delta = reltime(start) + echo printf('[%s] {%s} %s', reltimestr(delta), string(err), string(cmd)) + else + let out = system(cmd) + let err = v:shell_error endif if err @@ -1313,12 +1272,11 @@ function! s:NM_search_expand(arg) let b:nm_prev_bufnr = prev_bufnr endfunction -function! s:NM_add_remove_tags(filter, prefix, tags) +function! s:NM_tag(filter, tags) let filter = len(a:filter) ? a:filter : [NM_search_thread_id()] if !len(filter) throw 'Eeek! I couldn''t find the thead id!' endif - call map(a:tags, 'a:prefix . v:val') let args = ['tag'] call extend(args, a:tags) call add(args, '--') @@ -1327,20 +1285,6 @@ function! s:NM_add_remove_tags(filter, prefix, tags) call NM_run(args) endfunction -function! s:NM_add_remove_tags_on_screen(online, prefix, tags) - setlocal modifiable - if a:prefix == '-' - for tagname in a:tags - exec printf('silent! %ss/(\([^)]*\)\<%s\>\([^)]*\))$/(\1\2)/', string(a:online), tagname) - endfor - else - for tagname in a:tags - exec printf('silent! %ss/(\([^)]*\))$/(\1 %s)/', string(a:online), tagname) - endfor - endif - setlocal nomodifiable -endfunction - " --- process and set the defaults {{{1 function! NM_set_defaults(force)