X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=ecf7b9defe94859f581528a078407383b0c64043;hp=9e460e09b30c70b61ce106f7fffbf6eaa4006ea5;hb=de85b4752d51567ded73e9bbed75d0b8f5bfea71;hpb=804715316b1374709e08b58ffdc3900f31807e7a diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index 9e460e09..ecf7b9de 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -72,9 +72,10 @@ let g:notmuch_search_maps = { \ 'o': ':call NM_search_toggle_order()', \ 'r': ':call NM_search_reply_to_thread()', \ 's': ':call NM_search_prompt()', + \ 'S': ':call NM_search_edit()', \ 't': ':call NM_search_filter_by_tag()', - \ '+': ':call NM_search_add_tag()', - \ '-': ':call NM_search_remove_tag()', + \ '+': ':call NM_search_add_tags([])', + \ '-': ':call NM_search_remove_tags([])', \ '=': ':call NM_search_refresh_view()', \ } @@ -101,7 +102,7 @@ function! s:NM_cmd_search(words) let disp = copy(lines) call map(disp, 'substitute(v:val, "^thread:\\S* ", "", "")' ) - call s:NM_newBuffer('search', join(disp, "\n")) + call NM_newBuffer('search', join(disp, "\n")) let b:nm_raw_lines = lines call NM_set_map(g:notmuch_search_maps) @@ -109,24 +110,37 @@ function! s:NM_cmd_search(words) setlocal nowrap endfunction +" --- --- search screen action functions {{{2 + function! s:NM_search_show_thread() - if !exists('b:nm_raw_lines') - echo 'no b:nm_raw_lines' - else - let line = line('.') - let info = b:nm_raw_lines[line-1] - let what = split(info, '\s\+')[0] - call s:NM_cmd_show([what]) + let id = NM_search_find_thread_id() + if id != '' + call NM_cmd_show([id]) endif endfunction function! s:NM_search_prompt() - let new_list = input('NotMuch Search: ', join(g:notmuch_current_search_words, ' ')) - call NM_cmd_search(split(new_list)) + " TODO: input() can support completion + let text = input('NotMuch Search: ') + if strlen(text) + call NM_cmd_search(split(text)) + endif +endfunction + +function! s:NM_search_edit() + " TODO: input() can support completion + let text = input('NotMuch Search: ', join(g:notmuch_current_search_words, ' ')) + if strlen(text) + call NM_cmd_search(split(text)) + endif endfunction function! s:NM_search_archive_thread() - echoe 'Not implemented' + call NM_add_remove_tags('-', ['inbox']) + setlocal modifiable + s/(\([^)]*\)\\([^)]*\))$/(\1\2)/ + setlocal nomodifiable + norm j endfunction function! s:NM_search_filter() @@ -149,18 +163,58 @@ function! s:NM_search_filter_by_tag() echoe 'Not implemented' endfunction -function! s:NM_search_add_tag() - echoe 'Not implemented' +function! s:NM_search_add_tags(tags) + call NM_search_add_remove_tags('Add Tag(s): ', '+', a:tags) endfunction -function! s:NM_search_remove_tag() - echoe 'Not implemented' +function! s:NM_search_remove_tags(tags) + call NM_search_add_remove_tags('Remove Tag(s): ', '-', a:tags) endfunction function! s:NM_search_refresh_view() - echoe 'Not implemented' + let lno = line('.') + call NM_cmd_search(g:notmuch_current_search_words) + " FIXME: should find the line of the thread we were on if possible + exec printf('norm %dG', lno) +endfunction + +" --- --- search screen helper functions {{{2 + +function! s:NM_search_find_thread_id() + if !exists('b:nm_raw_lines') + echoe 'no b:nm_raw_lines' + return '' + else + let line = line('.') + let info = b:nm_raw_lines[line-1] + let what = split(info, '\s\+')[0] + return what + endif +endfunction + +function! s:NM_search_add_remove_tags(prompt, prefix, intags) + if type(a:intags) != type([]) || len(a:intags) == 0 + " TODO: input() can support completion + let text = input(a:prompt) + if !strlen(text) + return + endif + call NM_add_remove_tags(prefix, split(text, ' ')) + else + call NM_add_remove_tags(prefix, a:intags) + endif + call NM_search_refresh_view() endfunction +function! s:NM_add_remove_tags(prefix, tags) + let id = NM_search_find_thread_id() + if id == '' + echoe 'Eeek! I couldn''t find the thead id!' + endif + call map(a:tags, 'a:prefix . v:val') + " TODO: handle errors + call NM_run(['tag'] + a:tags + ['--', id]) +endfunction " --- implement show screen {{{1 @@ -171,13 +225,13 @@ function! s:NM_cmd_show(words) let info = s:NM_cmd_show_parse(lines) - call s:NM_newBuffer('show', join(info['disp'], "\n")) + call NM_newBuffer('show', join(info['disp'], "\n")) setlocal bufhidden=delete let b:nm_raw_info = info let b:nm_prev_bufnr = prev_bufnr - call s:NM_cmd_show_mkfolds() - call s:NM_cmd_show_mksyntax() + call NM_cmd_show_mkfolds() + call NM_cmd_show_mksyntax() call NM_set_map(g:notmuch_show_maps) setlocal foldtext=NM_cmd_show_foldtext() setlocal fillchars= @@ -503,7 +557,7 @@ endfunction function! NotMuch(args) if !strlen(a:args) - call s:NM_cmd_search(g:notmuch_current_search_words) + call NM_cmd_search(g:notmuch_current_search_words) return endif