X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=5fe438e78cf1eece676d160201c473738b2e9c2a;hp=865624fed01c698e90797b2894109d1c2ff29244;hb=71bdd859dc6f80a918412396cb66c219e0e60669;hpb=0265a0030348dbed4816d0619ac8806e76640184 diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index 865624fe..5fe438e7 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -25,27 +25,64 @@ if !exists('g:notmuch_cmd') let g:notmuch_cmd = 'notmuch' endif +if !exists('g:notmuch_search_reverse') + let g:notmuch_search_reverse = 1 +endif + +" --- used to match output of notmuch + +let s:notmuch_show_message_begin_regexp = '^ message{' +let s:notmuch_show_message_end_regexp = '^ message}' +let s:notmuch_show_header_begin_regexp = '^ header{' +let s:notmuch_show_header_end_regexp = '^ header}' +let s:notmuch_show_body_begin_regexp = '^ body{' +let s:notmuch_show_body_end_regexp = '^ body}' +let s:notmuch_show_attachment_begin_regexp = '^ attachment{' +let s:notmuch_show_attachment_end_regexp = '^ attachment}' +let s:notmuch_show_part_begin_regexp = '^ part{' +let s:notmuch_show_part_end_regexp = '^ part}' +let s:notmuch_show_marker_regexp = '^ \\(message\\|header\\|body\\|attachment\\|part\\)[{}].*$' + +let s:notmuch_show_id_regexp = '\(id:[^ ]*\)' +let s:notmuch_show_depth_regexp = ' depth:\([0-9]*\) ' +let s:notmuch_show_filename_regexp = 'filename:\(.*\)$' +let s:notmuch_show_tags_regexp = '(\([^)]*\))$' + +let s:notmuch_show_signature_regexp = '^\(-- \?\|_\+\)$' +let s:notmuch_show_signature_lines_max = 12 + +let s:notmuch_show_citation_regexp = '^\s*>' " --- implement search screen function! s:NM_cmd_search(words) - let data = split(s:NM_run(['search'] + a:words), "\n") - let disp = copy(data) + let cmd = ['search'] + if g:notmuch_search_reverse + let cmd = cmd + ['--reverse'] + 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 s:NM_newBuffer('search', join(disp, "\n")) - let b:nm_raw_data = data + let b:nm_raw_data = lines nnoremap :call NM_search_display() + nnoremap s :call NM_cmd_search(split(input('NotMuch Search:'))) + setlocal cursorline + setlocal nowrap endfunction function! s:NM_search_display() - let line = line('.') if !exists('b:nm_raw_data') echo 'no b:nm_raw_data' else - let info = b:nm_raw_data[line] - let what = split(info, '\W\+')[0] + let line = line('.') + let info = b:nm_raw_data[line-1] + let what = split(info, '\s\+')[0] call s:NM_cmd_show([what]) endif endfunction @@ -54,24 +91,61 @@ endfunction " --- implement show screen function! s:NM_cmd_show(words) + let bufnr = bufnr('%') let data = s:NM_run(['show'] + a:words) call s:NM_newBuffer('show', data) + setlocal bufhidden=delete let b:nm_raw_data = data + + call s:NM_cmd_show_mkfolds() + + exec printf("nnoremap q :b %d", bufnr) +endfunction + +function! s:NM_cmd_show_mkfolds() + let modetype = '' + let modeline = -1 + let lnum = 1 + while lnum <= line('$') + let line = getline(lnum) + if modetype == '' + if match(line, s:notmuch_show_signature_regexp) != -1 + let modetype = 'sig' + let modeline = lnum + elseif match(line, s:notmuch_show_citation_regexp) != -1 + let modetype = 'cit' + let modeline = lnum + endif + elseif modetype == 'cit' + if match(line, s:notmuch_show_citation_regexp) == -1 + exec printf('%d,%dfold', modeline, lnum) + let modetype = '' + endif + elseif modetype == 'sig' + if (lnum - modeline) > s:notmuch_show_signature_lines_max + let modetype = '' + elseif match(line, s:notmuch_show_part_end_regexp) != -1 + exec printf('%d,%dfold', modeline, lnum) + let modetype = '' + endif + endif + + let lnum = lnum + 1 + endwhile endfunction -" --- helper function +" --- helper functions function! s:NM_newBuffer(ft, content) enew setlocal buftype=nofile readonly modifiable - setlocal bufhidden=delete silent put=a:content keepjumps 0d setlocal nomodifiable - setlocal cursorline - execute printf('setlocal filetype=notmuch-%s', a:ft) + execute printf('set filetype=notmuch-%s', a:ft) + execute printf('set syntax=notmuch-%s', a:ft) endfunction function! s:NM_run(args)