X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=abb3cb468b54d75bdb8fa33bcc185cea785b8b2e;hp=4a4a2016f4725cc7f2b21a4ca09617eaa0d15fe1;hb=99f41984077c3e4cc9fa7a272c06149a2a029035;hpb=e2006a2f3cd1bc47b45f2b880f4dd5ba775d1b3b diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index 4a4a2016..abb3cb46 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -56,7 +56,7 @@ let s:notmuch_defaults = { " defaults for g:notmuch_initial_search_words " override with: let g:notmuch_initial_search_words = [ ... ] let s:notmuch_initial_search_words_defaults = [ - \ 'tag:inbox' + \ 'tag:inbox and tag:unread', \ ] " defaults for g:notmuch_show_headers @@ -66,7 +66,7 @@ let s:notmuch_show_headers_defaults = [ \ 'To', \ 'Cc', \ 'Bcc', - \ 'Date' + \ 'Date', \ ] " --- keyboard mapping definitions {{{1 @@ -82,7 +82,7 @@ let g:notmuch_search_maps = { \ 's': ':call NM_search_prompt()', \ 'S': ':call NM_search_edit()', \ 't': ':call NM_search_filter_by_tag()', - \ 'q': ':call NM_kill_buffer()', + \ 'q': ':call NM_kill_this_buffer()', \ '+': ':call NM_search_add_tags([])', \ '-': ':call NM_search_remove_tags([])', \ '=': ':call NM_search_refresh_view()', @@ -90,15 +90,29 @@ let g:notmuch_search_maps = { " --- --- bindings for show screen {{{2 let g:notmuch_show_maps = { - \ '': ':call NM_cmd_show_prev()', - \ '': ':call NM_cmd_show_next()', - \ 'b': ':call NM_cmd_show_fold_toggle(''b'', ''bdy'', !g:notmuch_show_fold_bodies)', - \ 'c': ':call NM_cmd_show_fold_toggle(''c'', ''cit'', !g:notmuch_show_fold_citations)', - \ 'h': ':call NM_cmd_show_fold_toggle(''h'', ''hdr'', !g:notmuch_show_fold_headers)', - \ 's': ':call NM_cmd_show_fold_toggle(''s'', ''sig'', !g:notmuch_show_fold_signatures)', - \ 'q': ':call NM_kill_buffer()', + \ '': ':call NM_show_prev(1)', + \ '': ':call NM_show_next(1)', + \ 'q': ':call NM_kill_this_buffer()', + \ + \ 'b': ':call NM_show_fold_toggle(''b'', ''bdy'', !g:notmuch_show_fold_bodies)', + \ 'c': ':call NM_show_fold_toggle(''c'', ''cit'', !g:notmuch_show_fold_citations)', + \ 'h': ':call NM_show_fold_toggle(''h'', ''hdr'', !g:notmuch_show_fold_headers)', + \ 's': ':call NM_show_fold_toggle(''s'', ''sig'', !g:notmuch_show_fold_signatures)', + \ + \ 'a': ':call NM_show_archive_thread()', + \ 'A': ':call NM_show_mark_read_then_archive_thread()', + \ 'N': ':call NM_show_mark_read_then_next_open_message()', + \ 'v': ':call NM_show_view_all_mime_parts()', + \ '+': ':call NM_show_add_tag()', + \ '-': ':call NM_show_remove_tag()', + \ '': ':call NM_show_advance_marking_read_and_archiving()', + \ '\|': ':call NM_show_pipe_message()', + \ + \ 'r': ':call NM_show_reply()', + \ 'm': ':call NM_new_mail()', \ } + " --- implement search screen {{{1 function! s:NM_cmd_search(words) @@ -175,11 +189,8 @@ 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']) - " TODO: this could be made better and more generic - setlocal modifiable - s/(\([^)]*\)\\([^)]*\))$/(\1\2)/ - setlocal nomodifiable norm j endfunction @@ -210,10 +221,6 @@ function! s:NM_search_filter_helper(prompt, prefix) let b:nm_prev_bufnr = prev_bufnr endfunction -function! s:NM_new_mail() - echoe 'Not implemented' -endfunction - function! s:NM_search_toggle_order() let g:notmuch_search_newest_first = !g:notmuch_search_newest_first " FIXME: maybe this would be better done w/o reading re-reading the lines @@ -222,7 +229,7 @@ function! s:NM_search_toggle_order() endfunction function! s:NM_search_reply_to_thread() - echoe 'Not implemented' + echo 'not implemented' endfunction function! s:NM_search_add_tags(tags) @@ -262,21 +269,12 @@ function! s:NM_search_add_remove_tags(prompt, prefix, intags) if !strlen(text) return endif - call NM_add_remove_tags(a:prefix, split(text, ' ')) + let tags = split(text, ' ') else - call NM_add_remove_tags(a:prefix, a:intags) + let tags = a:intags endif - call NM_search_refresh_view() -endfunction - -function! s:NM_add_remove_tags(prefix, tags) - let id = NM_search_find_thread_id() - if id == '' - echoe 'Eeek! I couldn''t find the thead id!' - endif - call map(a:tags, 'a:prefix . v:val') - " TODO: handle errors - call NM_run(['tag'] + a:tags + ['--', id]) + call NM_add_remove_tags(a:prefix, tags) + call NM_add_remove_tags_on_screen(a:prefix, tags) endfunction " --- implement show screen {{{1 @@ -303,38 +301,109 @@ function! s:NM_cmd_show(words) endfunction -function! s:NM_kill_buffer() - if exists('b:nm_prev_bufnr') - setlocal bufhidden=delete - exec printf(":buffer %d", b:nm_prev_bufnr) +function! s:NM_show_prev(can_change_thread) + let info = b:nm_raw_info + let lnum = line('.') + for msg in reverse(copy(info['msgs'])) + if lnum <= msg['start'] + continue + endif + + exec printf('norm %dG', msg['start']) + " TODO: try to fit the message on screen + norm zz + return + endfor + if !a:can_change_thread + return + endif + call NM_kill_this_buffer() + if line('.') != line('0') + norm k + call NM_search_show_thread() + norm G + call NM_show_prev(0) else - echo "Nothing to kill." + echo 'No more messages.' endif endfunction -function! s:NM_cmd_show_prev() - echoe "not implemented" -endfunction - -function! s:NM_cmd_show_next() +function! s:NM_show_next(can_change_thread) let info = b:nm_raw_info let lnum = line('.') - let cnt = 0 for msg in info['msgs'] - let cnt = cnt + 1 if lnum >= msg['start'] continue endif exec printf('norm %dG', msg['start']) + " TODO: try to fit the message on screen norm zz return endfor - norm qj - call NM_search_show_thread() + if !a:can_change_thread + return + endif + call NM_kill_this_buffer() + if line('.') != line('$') + norm j + call NM_search_show_thread() + else + echo 'No more messages.' + endif +endfunction + +function! s:NM_show_archive_thread() + echo 'not implemented' +endfunction + +function! s:NM_show_mark_read_then_archive_thread() + echo 'not implemented' +endfunction + +function! s:NM_show_next_message() + echo 'not implemented' +endfunction + +function! s:NM_show_mark_read_then_next_open_message() + echo 'not implemented' +endfunction + +function! s:NM_show_previous_message() + echo 'not implemented' +endfunction + +function! s:NM_show_reply() + echo 'not implemented' +endfunction + +function! s:NM_show_view_all_mime_parts() + echo 'not implemented' +endfunction + +function! s:NM_show_view_raw_message() + echo 'not implemented' endfunction -function! s:NM_cmd_show_fold_toggle(key, type, fold) +function! s:NM_show_add_tag() + echo 'not implemented' +endfunction + +function! s:NM_show_remove_tag() + echo 'not implemented' +endfunction + +function! s:NM_show_advance_marking_read_and_archiving() + echo 'not implemented' +endfunction + +function! s:NM_show_pipe_message() + echo 'not implemented' +endfunction + +" --- --- search screen helper functions {{{2 + +function! s:NM_show_fold_toggle(key, type, fold) let info = b:nm_raw_info let act = 'open' if a:fold @@ -345,7 +414,7 @@ function! s:NM_cmd_show_fold_toggle(key, type, fold) exec printf('%dfold%s', fld[1], act) endif endfor - exec printf('nnoremap %s :call NM_cmd_show_fold_toggle(''%s'', ''%s'', %d)', a:key, a:key, a:type, !a:fold) + exec printf('nnoremap %s :call NM_show_fold_toggle(''%s'', ''%s'', %d)', a:key, a:key, a:type, !a:fold) endfunction @@ -399,8 +468,10 @@ function! s:NM_cmd_show_parse(inlines) elseif mode_type == 'cit' if part_end || match(line, g:notmuch_show_citation_regexp) == -1 let outlnum = len(info['disp']) - let foldinfo = [ mode_type, mode_start, outlnum, - \ printf('[ %d-line citation. Press "c" to show. ]', outlnum - mode_start) ] + if mode_start != outlnum + let foldinfo = [ mode_type, mode_start, outlnum-1, + \ printf('[ %d-line citation. Press "c" to show. ]', outlnum - mode_start) ] + endif let mode_type = '' endif elseif mode_type == 'sig' @@ -577,8 +648,15 @@ endfunction function! s:NM_run(args) let cmd = g:notmuch_cmd . ' ' . join(a:args) . '< /dev/null' + + let start = reltime() let out = system(cmd) - if v:shell_error + let err = v:shell_error + let delta = reltime(start) + + echo printf('[%s] {%s} %s', reltimestr(delta), string(err), string(cmd)) + + if err echohl Error echo substitute(out, '\n*$', '', '') echohl None @@ -588,6 +666,48 @@ function! s:NM_run(args) endif endfunction +" --- external mail handling helpers {{{1 + +function! s:NM_new_mail() + echo 'not implemented' +endfunction + +" --- other helpers {{{1 + +function! s:NM_kill_this_buffer() + if exists('b:nm_prev_bufnr') + setlocal bufhidden=delete + exec printf(":buffer %d", b:nm_prev_bufnr) + else + echo "Nothing to kill." + endif +endfunction + +function! s:NM_add_remove_tags(prefix, tags) + let id = NM_search_find_thread_id() + if id == '' + echoe 'Eeek! I couldn''t find the thead id!' + endif + call map(a:tags, 'a:prefix . v:val') + " TODO: handle errors + call NM_run(['tag'] + a:tags + ['--', id]) +endfunction + +function! s:NM_add_remove_tags_on_screen(prefix, tags) + let online = '' + setlocal modifiable + if a:prefix == '-' + for tagname in a:tags + exec printf('silent %ss/(\([^)]*\)\<%s\>\([^)]*\))$/(\1\2)/', online, tagname) + endfor + else + for tagname in a:tags + exec printf('silent %ss/(\([^)]*\)\([^)]*\))$/(\1 %s)/', online, tagname) + endfor + endif + setlocal nomodifiable +endfunction + " --- process and set the defaults {{{1 function! NM_set_defaults(force) @@ -623,9 +743,12 @@ endif " --- assign keymaps {{{1 function! s:NM_set_map(maps) + nmapclear for [key, code] in items(a:maps) exec printf('nnoremap %s %s', key, code) endfor + " --- this is a hack for development :) + nnoremap ,nmr :source ~/.vim/plugin/notmuch.vim:call NotMuch('') endfunction " --- command handler {{{1 @@ -656,8 +779,4 @@ endfunction command! -nargs=* -complete=customlist,CompleteNotMuch NotMuch call NotMuch() cabbrev notmuch =(getcmdtype()==':' && getcmdpos()==1 ? 'NotMuch' : 'notmuch') -" --- hacks, only for development :) {{{1 - -nnoremap ,nmr :source ~/.vim/plugin/notmuch.vim:call NotMuch('') - " vim: set ft=vim ts=8 sw=8 et foldmethod=marker :