X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=ed67d34a332688c3375b17732fff49347c0ab4bf;hp=b78a638236415f79619d0f1005da5bdaec11c1a8;hb=0f7b098f63058fd2a0869453739f3e44a9876fcc;hpb=7888bffce748ecfe0b49460bcda6033a4a74a66e diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index b78a6382..ed67d34a 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -74,6 +74,7 @@ let g:notmuch_search_maps = { \ 's': ':call NM_search_prompt()', \ 'S': ':call NM_search_edit()', \ 't': ':call NM_search_filter_by_tag()', + \ 'q': ':call NM_kill_buffer()', \ '+': ':call NM_search_add_tags([])', \ '-': ':call NM_search_remove_tags([])', \ '=': ':call NM_search_refresh_view()', @@ -81,10 +82,10 @@ let g:notmuch_search_maps = { " --- --- bindings for show screen {{{2 let g:notmuch_show_maps = { - \ 'q': ':call NM_cmd_show_quit()', - \ '': ':call NM_cmd_show_next()', - \ 'c': ':call NM_cmd_show_fold_toggle(''c'', ''cit'', !g:notmuch_show_fold_citations)', - \ 's': ':call NM_cmd_show_fold_toggle(''s'', ''sig'', !g:notmuch_show_fold_signatures)', + \ '': ':call NM_cmd_show_next()', + \ 'c': ':call NM_cmd_show_fold_toggle(''c'', ''cit'', !g:notmuch_show_fold_citations)', + \ 's': ':call NM_cmd_show_fold_toggle(''s'', ''sig'', !g:notmuch_show_fold_signatures)', + \ 'q': ':call NM_kill_buffer()', \ } " --- implement search screen {{{1 @@ -94,7 +95,6 @@ function! s:NM_cmd_search(words) if g:notmuch_search_reverse let cmd = cmd + ['--reverse'] endif - let g:notmuch_current_search_words = a:words let data = s:NM_run(cmd + a:words) "let data = substitute(data, '27/27', '25/27', '') "let data = substitute(data, '\[4/4\]', '[0/4]', '') @@ -102,8 +102,9 @@ 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 + let b:nm_search_words = a:words call NM_set_map(g:notmuch_search_maps) setlocal cursorline @@ -115,7 +116,7 @@ endfunction function! s:NM_search_show_thread() let id = NM_search_find_thread_id() if id != '' - call s:NM_cmd_show([id]) + call NM_cmd_show([id]) endif endfunction @@ -123,25 +124,56 @@ function! s:NM_search_prompt() " TODO: input() can support completion let text = input('NotMuch Search: ') if strlen(text) - call NM_cmd_search(split(text)) + let tags = split(text) + else + let tags = s:notmuch_initial_search_words_defaults endif + setlocal bufhidden=delete + call NM_cmd_search(tags) endfunction function! s:NM_search_edit() " TODO: input() can support completion - let text = input('NotMuch Search: ', join(g:notmuch_current_search_words, ' ')) + let text = input('NotMuch Search: ', join(b:nm_search_words, ' ')) if strlen(text) call NM_cmd_search(split(text)) endif endfunction function! s:NM_search_archive_thread() - call NM_search_remove_tags('inbox') + call NM_add_remove_tags('-', ['inbox']) + " TODO: this could be made better and more generic + setlocal modifiable + s/(\([^)]*\)\\([^)]*\))$/(\1\2)/ + setlocal nomodifiable norm j endfunction function! s:NM_search_filter() - echoe 'Not implemented' + call NM_search_filter_helper('Filter: ', '') +endfunction + +function! s:NM_search_filter_by_tag() + call NM_search_filter_helper('Filter Tag(s): ', 'tag:') +endfunction + +function! s:NM_search_filter_helper(prompt, prefix) + " TODO: input() can support completion + let text = input(a:prompt) + if !strlen(text) + return + endif + + let tags = split(text) + map(tags, 'a:prefix . v:val') + let tags = b:nm_search_words + tags + echo tags + + let prev_bufnr = bufnr('%') + setlocal bufhidden=hide + call NM_cmd_search(tags) + setlocal bufhidden=delete + let b:nm_prev_bufnr = prev_bufnr endfunction function! s:NM_new_mail() @@ -149,17 +181,16 @@ function! s:NM_new_mail() endfunction function! s:NM_search_toggle_order() - echoe 'Not implemented' + let g:notmuch_search_reverse = !g:notmuch_search_reverse + " 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() echoe 'Not implemented' endfunction -function! s:NM_search_filter_by_tag() - echoe 'Not implemented' -endfunction - function! s:NM_search_add_tags(tags) call NM_search_add_remove_tags('Add Tag(s): ', '+', a:tags) endfunction @@ -170,7 +201,8 @@ endfunction function! s:NM_search_refresh_view() let lno = line('.') - call s:NM_cmd_search(g:notmuch_current_search_words) + 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) endfunction @@ -190,23 +222,27 @@ function! s:NM_search_find_thread_id() endfunction function! s:NM_search_add_remove_tags(prompt, prefix, intags) - let id = NM_search_find_thread_id() - if id != '' - if type(a:intags) != type([]) || len(a:intags) == 0 - " TODO: input() can support completion - let text = input(a:prompt) - if !strlen(text) - return - endif - let tags = split(text, ' ') - else - let tags = a: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 map(tags, 'a:prefix . v:val') - " TODO: handle errors - call NM_run(['tag'] + tags + ['--', id]) - call NM_search_refresh_view() + 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 @@ -218,13 +254,14 @@ function! s:NM_cmd_show(words) let info = s:NM_cmd_show_parse(lines) - call s:NM_newBuffer('show', join(info['disp'], "\n")) + setlocal bufhidden=hide + 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= @@ -232,8 +269,13 @@ function! s:NM_cmd_show(words) endfunction -function! s:NM_cmd_show_quit() - exec printf(":buffer %d", b:nm_prev_bufnr) +function! s:NM_kill_buffer() + if exists('b:nm_prev_bufnr') + setlocal bufhidden=delete + exec printf(":buffer %d", b:nm_prev_bufnr) + else + echo "Nothing to kill." + endif endfunction function! s:NM_cmd_show_next() @@ -534,9 +576,6 @@ if !exists('g:notmuch_initial_search_words') let g:notmuch_initial_search_words = s:notmuch_initial_search_words_defaults endif -" this is the default querry -let g:notmuch_current_search_words = g:notmuch_initial_search_words - " --- assign keymaps {{{1 @@ -550,7 +589,12 @@ endfunction function! NotMuch(args) if !strlen(a:args) - call s:NM_cmd_search(g:notmuch_current_search_words) + if 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