X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=8f6c7748ca5c1495c88c923f39cc9caa511bef93;hp=7ba35f37c9ebecdde0352ea74d3c227b0a9fe20c;hb=5a32a1d48f790d5bb63e5e7e70b989cd94692c0a;hpb=e9ca8e5037a4292443eb1cac8540757f118b83f4 diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index 7ba35f37..8f6c7748 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,9 +129,13 @@ 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_thread_id() . '' '' . NM_show_message_id()', + \ '?': ':echo NM_show_message_id() . '' @ '' . join(NM_show_search_words())', \ } @@ -218,7 +223,7 @@ function! s:NM_cmd_search_fmtline(line) if strlen(from) >= max let from = substitute(m[3][0:max-4], '[^A-Za-z1-9_]*$', '', '') . '...' endif - return printf('%s %-20s | %s (%s)', m[2], from, m[4], m[5]) + return printf('%-20s %-20s | %s (%s)', m[2], from, m[4], m[5]) endfunction function! s:NM_cmd_search_mksyntax() syntax clear nmSearchFrom @@ -230,7 +235,13 @@ endfunction function! s:NM_search_show_thread() let id = NM_search_thread_id() if id != '' - call NM_cmd_show([id]) + let words = [id] + if exists('b:nm_search_words') + let words = ['('] + b:nm_search_words + [')', 'and', id] + endif + if len(words) + call NM_cmd_show(words) + endif endif endfunction @@ -296,7 +307,7 @@ function! s:NM_search_filter_helper(prompt, prefix, joiner) let idx = idx - 1 endwhile endif - let tags = b:nm_search_words + ['and', '''('] + tags + [')'''] + let tags = b:nm_search_words + ['and', '('] + tags + [')'] let prev_bufnr = bufnr('%') setlocal bufhidden=hide @@ -326,8 +337,10 @@ endfunction function! s:NM_search_refresh_view() let lno = line('.') + let prev_bufnr = b:nm_prev_bufnr setlocal bufhidden=delete call NM_cmd_search(b:nm_search_words) + let b:nm_prev_bufnr = prev_bufnr " FIXME: should find the line of the thread we were on if possible exec printf('norm %dG', lno) endfunction @@ -486,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' @@ -504,15 +522,25 @@ function! s:NM_show_message_id() let info = b:nm_raw_info let lnum = line('.') for msg in info['msgs'] - if lnum >= msg['start'] + if lnum > msg['end'] continue endif - - return msg['id'] + if has_key(msg,'id') + return msg['id'] + endif + return '' endfor return '' endfunction +function! s:NM_show_search_words() + if !exists('b:nm_words') + echoe 'no b:nm_words' + return [] + endif + return b:nm_words +endfunction + function! s:NM_show_fold_toggle(key, type, fold) let info = b:nm_raw_info let act = 'open' @@ -578,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 @@ -587,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 @@ -598,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'], '') @@ -614,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 @@ -641,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 @@ -662,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) @@ -690,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 @@ -698,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 @@ -710,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 @@ -755,15 +790,24 @@ function! s:NM_newBuffer(type, content) let b:nm_type = a:type endfunction +function! s:NM_shell_escape(word) + let word = substitute(a:word, '''', '\\''', 'g') + return '''' . word . '''' +endfunction + function! s:NM_run(args) - let cmd = g:notmuch_cmd . ' ' . join(a:args) . '< /dev/null' + let words = a: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) - 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