X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=308fc05d8010094bffe66678d54ceecfbc7301cf;hp=09df1ed9aea3e5ca8a15d6aba755e1264482a662;hb=5a9d5fb20091a34efdf6716d4481799097ec9269;hpb=64339e6324d2fdc13eb3a7e357390271616528b9 diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index 09df1ed9..308fc05d 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -69,8 +69,25 @@ let s:notmuch_show_headers_defaults = [ \ 'Date', \ ] +" defaults for g:notmuch_folders +" override with: let g:notmuch_folders = [ ... ] +let s:notmuch_folders_defaults = [ + \ [ 'new', 'tag:inbox and tag:unread' ], + \ [ 'inbox', 'tag:inbox' ], + \ [ 'unread', 'tag:unread' ], + \ ] + " --- keyboard mapping definitions {{{1 +" --- --- bindings for folders mode {{{2 + +let g:notmuch_folders_maps = { + \ 's': ':call NM_search_prompt()', + \ 'q': ':call NM_kill_this_buffer()', + \ '=': ':call NM_folders_refresh_view()', + \ '': ':call NM_folders_show_search()', + \ } + " --- --- bindings for search screen {{{2 let g:notmuch_search_maps = { \ '': ':call NM_search_show_thread()', @@ -90,7 +107,7 @@ let g:notmuch_search_maps = { " --- --- bindings for show screen {{{2 let g:notmuch_show_maps = { - \ '': ':call NM_show_prev(1)', + \ '': ':call NM_show_previous(1)', \ '': ':call NM_show_next(1)', \ 'q': ':call NM_kill_this_buffer()', \ @@ -113,6 +130,57 @@ let g:notmuch_show_maps = { \ } +" --- implement folders screen {{{1 + +function! s:NM_cmd_folders(words) + if len(a:words) + echoe 'Not exapecting any arguments for folders command.' + endif + let cmd = ['count'] + let disp = [] + let searches = [] + for entry in g:notmuch_folders + let [ name, search ] = entry + let data = s:NM_run(cmd + [search]) + let cnt = matchlist(data, '\(\d\+\)')[1] + call add(disp, printf('%9d %-20s (%s)', cnt, name, search)) + call add(searches, search) + endfor + + call NM_newBuffer('folders', join(disp, "\n")) + let b:nm_searches = searches + let b:nm_timestamp = reltime() + + call NM_cmd_folders_mksyntax() + call NM_set_map(g:notmuch_folders_maps) + setlocal cursorline + setlocal nowrap +endfunction + +function! s:NM_cmd_folders_mksyntax() +endfunction + +" --- --- folders screen action functions {{{2 + +function! s:NM_folders_refresh_view() + let lno = line('.') + setlocal bufhidden=delete + call s:NM_cmd_folders([]) + exec printf('norm %dG', lno) +endfunction + +function! s:NM_folders_show_search() + let line = line('.') + let search = b:nm_searches[line-1] + + let prev_bufnr = bufnr('%') + setlocal bufhidden=hide + call NM_cmd_search([search]) + setlocal bufhidden=delete + let b:nm_prev_bufnr = prev_bufnr +endfunction + + " --- implement search screen {{{1 function! s:NM_cmd_search(words) @@ -123,11 +191,8 @@ function! s:NM_cmd_search(words) 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, 's:NM_cmd_search_fmtline(v:val)') call NM_newBuffer('search', join(disp, "\n")) @@ -176,8 +241,17 @@ function! s:NM_search_prompt() else let tags = s:notmuch_initial_search_words_defaults endif - setlocal bufhidden=delete + let prev_bufnr = bufnr('%') + if b:nm_type == 'search' + " TODO: we intend to replace the current buffer, + " ... maybe we could just clear it + setlocal bufhidden=delete + else + setlocal bufhidden=hide + endif call NM_cmd_search(tags) + setlocal bufhidden=delete + let b:nm_prev_bufnr = prev_bufnr endfunction function! s:NM_search_edit() @@ -301,7 +375,7 @@ function! s:NM_cmd_show(words) endfunction -function! s:NM_show_prev(can_change_thread) +function! s:NM_show_previous(can_change_thread) let info = b:nm_raw_info let lnum = line('.') for msg in reverse(copy(info['msgs'])) @@ -322,7 +396,7 @@ function! s:NM_show_prev(can_change_thread) norm k call NM_search_show_thread() norm G - call NM_show_prev(0) + call NM_show_previous(0) else echo 'No more messages.' endif @@ -479,8 +553,10 @@ 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, - \ printf('[ %d-line signature. Press "s" to show. ]', outlnum - mode_start) ] + if mode_start != outlnum + let foldinfo = [ mode_type, mode_start, outlnum-1, + \ printf('[ %d-line signature. Press "s" to show. ]', outlnum - mode_start) ] + endif let mode_type = '' endif endif @@ -534,7 +610,7 @@ function! s:NM_cmd_show_parse(inlines) 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) ] + \ printf('[ %d-line headers. Press "h" to show. ]', hdr_end + 1 - hdr_start) ] let msg['header'] = hdr let in_header = 0 let hdr = {} @@ -636,14 +712,15 @@ endfunction " --- notmuch helper functions {{{1 -function! s:NM_newBuffer(ft, content) +function! s:NM_newBuffer(type, content) enew setlocal buftype=nofile readonly modifiable silent put=a:content keepjumps 0d setlocal nomodifiable - execute printf('set filetype=notmuch-%s', a:ft) - execute printf('set syntax=notmuch-%s', a:ft) + execute printf('set filetype=notmuch-%s', a:type) + execute printf('set syntax=notmuch-%s', a:type) + let b:nm_type = a:type endfunction function! s:NM_run(args) @@ -738,33 +815,47 @@ endif if !exists('g:notmuch_initial_search_words') let g:notmuch_initial_search_words = s:notmuch_initial_search_words_defaults endif +if !exists('g:notmuch_folders') + let g:notmuch_folders = s:notmuch_folders_defaults +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 function! NotMuch(args) - if !strlen(a:args) - if exists('b:nm_search_words') + let args = a:args + if !strlen(args) + let args = 'folders' + endif + + let words = split(args) + if words[0] == 'folders' + let words = words[1:] + call NM_cmd_folders(words) + elseif words[0] == 'search' + if len(words) > 1 + let words = words[1:] + elseif exists('b:nm_search_words') let words = b:nm_search_words else let words = g:notmuch_initial_search_words endif call NM_cmd_search(words) - return - endif - - echo "blarg!" - let words = split(a:args) - " TODO: handle commands passed as arguments + elseif words[0] == 'show' + echoe 'show is not yet implemented.' + endif endfunction function! CompleteNotMuch(arg_lead, cmd_line, cursor_pos) return [] @@ -776,8 +867,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 :