X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=4a4a2016f4725cc7f2b21a4ca09617eaa0d15fe1;hp=dbe198539299364ced8f3bf8706af2ea1b273059;hb=e2006a2f3cd1bc47b45f2b880f4dd5ba775d1b3b;hpb=dbd90c1fc72c4b26073524587db721a276607594 diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index dbe19853..4a4a2016 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -23,9 +23,14 @@ let s:notmuch_defaults = { \ 'g:notmuch_cmd': 'notmuch' , - \ 'g:notmuch_search_reverse': 1 , + \ + \ 'g:notmuch_search_newest_first': 1 , + \ 'g:notmuch_search_from_column_width': 20 , + \ \ 'g:notmuch_show_fold_signatures': 1 , \ 'g:notmuch_show_fold_citations': 1 , + \ '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}' , @@ -58,7 +63,10 @@ let s:notmuch_initial_search_words_defaults = [ " override with: let g:notmuch_show_headers = [ ... ] let s:notmuch_show_headers_defaults = [ \ 'Subject', - \ 'From' + \ 'To', + \ 'Cc', + \ 'Bcc', + \ 'Date' \ ] " --- keyboard mapping definitions {{{1 @@ -82,8 +90,11 @@ 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()', \ } @@ -92,24 +103,47 @@ let g:notmuch_show_maps = { function! s:NM_cmd_search(words) let cmd = ['search'] - if g:notmuch_search_reverse - let cmd = cmd + ['--reverse'] + if g:notmuch_search_newest_first + let cmd = cmd + ['--sort=newest-first'] + else + let cmd = cmd + ['--sort=oldest-first'] endif let data = s:NM_run(cmd + a:words) "let data = substitute(data, '27/27', '25/27', '') "let data = substitute(data, '\[4/4\]', '[0/4]', '') let lines = split(data, "\n") let disp = copy(lines) - call map(disp, 'substitute(v:val, "^thread:\\S* ", "", "")' ) + "call map(disp, 'substitute(v:val, "^thread:\\S* ", "", "")' ) + call map(disp, 's:NM_cmd_search_fmtline(v:val)') call NM_newBuffer('search', join(disp, "\n")) let b:nm_raw_lines = lines let b:nm_search_words = a:words + call NM_cmd_search_mksyntax() call NM_set_map(g:notmuch_search_maps) setlocal cursorline setlocal nowrap endfunction +function! s:NM_cmd_search_fmtline(line) + let m = matchlist(a:line, '^\(thread:\S\+\)\s\([^]]\+\]\) \([^;]\+\); \(.*\) (\([^(]*\))$') + 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 = m[3][0:max-4] . '...' + endif + return printf('%s %-20s | %s (%s)', m[2], from, m[4], m[5]) +endfunction +function! s:NM_cmd_search_mksyntax() + syntax clear nmSearchFrom + "syntax region nmSearchFrom start='\]\@<=' end='.'me=e+5,he=e+5,re=e+5 oneline contained + "syntax match nmSearchFrom /\]\@<=.\{10\}/ oneline contained + exec printf('syntax match nmSearchFrom /\(\] \)\@<=.\{%d\}/ oneline contained', g:notmuch_search_from_column_width) + "exec printf('syntax region nmSearchFrom start=''\%%%dv'' end=''\%%%dv'' oneline contained', 20, 30) +endfunction " --- --- search screen action functions {{{2 @@ -165,7 +199,7 @@ function! s:NM_search_filter_helper(prompt, prefix) endif let tags = split(text) - map(tags, 'a:prefix . v:val') + map(tags, 'and a:prefix . v:val') let tags = b:nm_search_words + tags echo tags @@ -181,7 +215,10 @@ function! s:NM_new_mail() endfunction function! s:NM_search_toggle_order() - echoe 'Not implemented' + 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 + " reversing the b:nm_raw_lines and the buffer lines would be better + call NM_search_refresh_view() endfunction function! s:NM_search_reply_to_thread() @@ -198,6 +235,7 @@ endfunction function! s:NM_search_refresh_view() let lno = line('.') + setlocal bufhidden=delete call NM_cmd_search(b:nm_search_words) " FIXME: should find the line of the thread we were on if possible exec printf('norm %dG', lno) @@ -224,9 +262,9 @@ function! s:NM_search_add_remove_tags(prompt, prefix, intags) if !strlen(text) return endif - call NM_add_remove_tags(prefix, split(text, ' ')) + call NM_add_remove_tags(a:prefix, split(text, ' ')) else - call NM_add_remove_tags(prefix, a:intags) + call NM_add_remove_tags(a:prefix, a:intags) endif call NM_search_refresh_view() endfunction @@ -274,6 +312,10 @@ function! s:NM_kill_buffer() endif endfunction +function! s:NM_cmd_show_prev() + echoe "not implemented" +endfunction + function! s:NM_cmd_show_next() let info = b:nm_raw_info let lnum = line('.') @@ -364,7 +406,6 @@ function! s:NM_cmd_show_parse(inlines) elseif mode_type == 'sig' let outlnum = len(info['disp']) if (outlnum - mode_start) > g:notmuch_show_signature_lines_max - echoe 'line ' . outlnum . ' stopped matching' let mode_type = '' elseif part_end let foldinfo = [ mode_type, mode_start, outlnum, @@ -394,7 +435,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 = [ 'body', body_start, body_end, + let foldinfo = [ 'bdy', body_start, body_end, \ printf('[ BODY %d - %d lines ]', len(info['msgs']), body_end - body_start) ] let in_body = 0 @@ -419,6 +460,10 @@ function! s:NM_cmd_show_parse(inlines) else 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, + \ printf('[ %d-line headers. Press "h" to show. ]', hdr_end - hdr_start) ] let msg['header'] = hdr let in_header = 0 let hdr = {} @@ -438,7 +483,7 @@ function! s:NM_cmd_show_parse(inlines) let msg['end'] = len(info['disp']) call add(info['disp'], '') - let foldinfo = [ 'match', msg['start'], msg['end'], + let foldinfo = [ 'msg', msg['start'], msg['end'], \ printf('[ MSG %d - %s ]', len(info['msgs']), msg['descr']) ] call add(info['msgs'], msg) @@ -488,6 +533,8 @@ function! s:NM_cmd_show_mkfolds() exec printf('%d,%dfold', afold[1], afold[2]) 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])