X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=f0106604f081a5a296c126a5157f59feb36c8f36;hp=aff492667b3d1db6773bbfebe79456b0d3fb277f;hb=b440aeb23e8ddc3c88c697718aedab0ab9ca3245;hpb=b740392b3de8fad233e1cf9db7c881208d76115c diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index aff49266..f0106604 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -23,6 +23,7 @@ let s:notmuch_defaults = { \ 'g:notmuch_cmd': 'notmuch' , + \ 'g:notmuch_debug': 0 , \ \ 'g:notmuch_search_newest_first': 1 , \ 'g:notmuch_search_from_column_width': 20 , @@ -44,7 +45,7 @@ let s:notmuch_defaults = { \ '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]*\) filename:\(.*\)$', + \ 'g:notmuch_show_message_parse_regexp': '\(id:[^ ]*\) depth:\([0-9]*\) match:\([0-9]*\) filename:\(.*\)$', \ 'g:notmuch_show_tags_regexp': '(\([^)]*\))$' , \ \ 'g:notmuch_show_signature_regexp': '^\(-- \?\|_\+\)$' , @@ -128,6 +129,10 @@ let g:notmuch_show_maps = { \ '': ':call NM_show_advance_marking_read_and_archiving()', \ '\|': ':call NM_show_pipe_message()', \ + \ '': ':call NM_show_previous_fold()', + \ '': ':call NM_show_next_fold()', + \ '': ':call NM_show_toggle_fold()', + \ \ 'r': ':call NM_show_reply()', \ 'm': ':call NM_new_mail()', \ '?': ':echo NM_show_message_id() . '' @ '' . join(NM_show_search_words())', @@ -271,8 +276,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']) + call NM_add_remove_tags_on_screen('', '-', ['inbox']) + call NM_add_remove_tags([], '-', ['inbox']) norm j endfunction @@ -365,8 +370,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 NM_add_remove_tags([], a:prefix, tags) + call NM_add_remove_tags_on_screen('', a:prefix, tags) endfunction " --- implement show screen {{{1 @@ -494,16 +499,21 @@ function! s:NM_show_pipe_message() echo 'not implemented' endfunction -" --- --- show screen helper functions {{{2 +function! s:NM_show_previous_fold() + echo 'not implemented' +endfunction -function! s:NM_show_thread_id() - if !exists('b:nm_words') - echoe 'no b:nm_words' - return '' - endif - return b:nm_words[0] +function! s:NM_show_next_fold() + echo 'not implemented' +endfunction + +function! s:NM_show_toggle_fold() + echo 'not implemented' endfunction + +" --- --- show screen helper functions {{{2 + function! s:NM_show_message_id() if !exists('b:nm_raw_info') echoe 'no b:nm_raw_info' @@ -515,8 +525,10 @@ function! s:NM_show_message_id() if lnum > msg['end'] continue endif - - return msg['id'] + if has_key(msg,'id') + return msg['id'] + endif + return '' endfor return '' endfunction @@ -594,7 +606,7 @@ 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-1, + let foldinfo = [ mode_type, mode_start, outlnum-1, len(info['msgs']), \ printf('[ %d-line citation. Press "c" to show. ]', outlnum - mode_start) ] let mode_type = '' endif @@ -603,7 +615,7 @@ function! s:NM_cmd_show_parse(inlines) if (outlnum - mode_start) > g:notmuch_show_signature_lines_max let mode_type = '' elseif part_end - let foldinfo = [ mode_type, mode_start, outlnum-1, + let foldinfo = [ mode_type, mode_start, outlnum-1, len(info['msgs']), \ printf('[ %d-line signature. Press "s" to show. ]', outlnum - mode_start) ] let mode_type = '' endif @@ -614,11 +626,11 @@ function! s:NM_cmd_show_parse(inlines) " FIXME: this is a hack for handling two folds being added for one line " we should handle addinga fold in a function if len(foldinfo) && foldinfo[1] < foldinfo[2] - call add(info['folds'], foldinfo[0:2]) - let info['foldtext'][foldinfo[1]] = foldinfo[3] + call add(info['folds'], foldinfo[0:3]) + let info['foldtext'][foldinfo[1]] = foldinfo[4] endif - let foldinfo = [ 'text', part_start, part_end, + let foldinfo = [ 'text', part_start, part_end, len(info['msgs']), \ printf('[ %d-line %s. Press "p" to show. ]', part_end - part_start, in_part) ] let in_part = '' call add(info['disp'], '') @@ -630,7 +642,7 @@ function! s:NM_cmd_show_parse(inlines) endif if match(line, g:notmuch_show_body_end_regexp) != -1 let body_end = len(info['disp']) - let foldinfo = [ 'bdy', body_start, body_end, + let foldinfo = [ 'bdy', body_start, body_end, len(info['msgs']), \ printf('[ BODY %d - %d lines ]', len(info['msgs']), body_end - body_start) ] let in_body = 0 @@ -657,7 +669,7 @@ function! s:NM_cmd_show_parse(inlines) if match(line, g:notmuch_show_header_end_regexp) != -1 let hdr_start = msg['hdr_start']+1 let hdr_end = len(info['disp']) - let foldinfo = [ 'hdr', hdr_start, hdr_end, + let foldinfo = [ 'hdr', hdr_start, hdr_end, len(info['msgs']), \ printf('[ %d-line headers. Press "h" to show. ]', hdr_end + 1 - hdr_start) ] let msg['header'] = hdr let in_header = 0 @@ -678,7 +690,7 @@ function! s:NM_cmd_show_parse(inlines) let msg['end'] = len(info['disp']) call add(info['disp'], '') - let foldinfo = [ 'msg', msg['start'], msg['end'], + let foldinfo = [ 'msg', msg['start'], msg['end'], len(info['msgs']), \ printf('[ MSG %d - %s ]', len(info['msgs']), msg['descr']) ] call add(info['msgs'], msg) @@ -706,7 +718,8 @@ function! s:NM_cmd_show_parse(inlines) if len(m) let msg['id'] = m[1] let msg['depth'] = m[2] - let msg['filename'] = m[3] + let msg['match'] = m[3] + let msg['filename'] = m[4] endif let in_message = 1 @@ -714,8 +727,8 @@ function! s:NM_cmd_show_parse(inlines) endif if len(foldinfo) && foldinfo[1] < foldinfo[2] - call add(info['folds'], foldinfo[0:2]) - let info['foldtext'][foldinfo[1]] = foldinfo[3] + call add(info['folds'], foldinfo[0:3]) + let info['foldtext'][foldinfo[1]] = foldinfo[4] endif endfor return info @@ -726,14 +739,20 @@ function! s:NM_cmd_show_mkfolds() for afold in info['folds'] exec printf('%d,%dfold', afold[1], afold[2]) + let state = 'open' if (afold[0] == 'sig' && g:notmuch_show_fold_signatures) \ || (afold[0] == 'cit' && g:notmuch_show_fold_citations) \ || (afold[0] == 'bdy' && g:notmuch_show_fold_bodies) \ || (afold[0] == 'hdr' && g:notmuch_show_fold_headers) - exec printf('%dfoldclose', afold[1]) - else - exec printf('%dfoldopen', afold[1]) + let state = 'close' + elseif afold[0] == 'msg' + let idx = afold[3] + let msg = info['msgs'][idx] + if has_key(msg,'match') && msg['match'] == '0' + let state = 'close' + endif endif + exec printf('%dfold%s', afold[1], state) endfor endfunction @@ -786,7 +805,9 @@ function! s:NM_run(args) let err = v:shell_error let delta = reltime(start) - echo printf('[%s] {%s} %s', reltimestr(delta), string(err), string(cmd)) + if exists('g:notmuch_debug') && g:notmuch_debug + echo printf('[%s] {%s} %s', reltimestr(delta), string(err), string(cmd)) + endif if err echohl Error @@ -824,26 +845,31 @@ function! s:NM_search_expand(arg) let b:nm_prev_bufnr = prev_bufnr endfunction -function! s:NM_add_remove_tags(prefix, tags) - let id = NM_search_thread_id() - if id == '' +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!' endif + echo 'filter = ' . string(filter) . ' ... ' . string(type(filter)) call map(a:tags, 'a:prefix . v:val') " TODO: handle errors - call NM_run(['tag'] + a:tags + ['--', id]) + let args = ['tag'] + call extend(args, a:tags) + call add(args, '--') + call extend(args, filter) + echo 'NUM_run( ' . string(args) . ' )' + call NM_run(args) endfunction -function! s:NM_add_remove_tags_on_screen(prefix, tags) - let online = '' +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)/', online, tagname) + exec printf('silent! %ss/(\([^)]*\)\<%s\>\([^)]*\))$/(\1\2)/', string(a:online), tagname) endfor else for tagname in a:tags - exec printf('silent %ss/(\([^)]*\)\([^)]*\))$/(\1 %s)/', online, tagname) + exec printf('silent! %ss/(\([^)]*\)\([^)]*\))$/(\1 %s)/', string(a:online), tagname) endfor endif setlocal nomodifiable