X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=daff4aab120dcb9cce5c0c1e3c858ac95de56e8c;hp=b63417b8bf0464ae693f3c5913a773540431a7dd;hb=efa9df2d49b522cc981dc1ab0637219047753483;hpb=a04334e95903cfeb4f26d1820eeeb0ed63487dea diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index b63417b8..daff4aab 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -127,7 +127,7 @@ let g:notmuch_search_maps = { \ '+': ':call NM_search_add_tags([])', \ '-': ':call NM_search_remove_tags([])', \ '=': ':call NM_search_refresh_view()', - \ '?': ':echo NM_search_thread_id()', + \ '?': ':echo NM_search_thread_id() . '' @ '' . join(NM_get_search_words())', \ } " --- --- bindings for show screen {{{2 @@ -157,7 +157,7 @@ let g:notmuch_show_maps = { \ \ 'r': ':call NM_show_reply()', \ 'm': ':call NM_new_mail()', - \ '?': ':echo NM_show_message_id() . '' @ '' . join(NM_show_search_words())', + \ '?': ':echo NM_show_message_id() . '' @ '' . join(NM_get_search_words())', \ } " --- --- bindings for compose screen {{{2 @@ -175,7 +175,7 @@ let g:notmuch_compose_imaps = { function! s:NM_cmd_folders(words) if len(a:words) - echoe 'Not exapecting any arguments for folders command.' + throw 'Not exapecting any arguments for folders command.' endif let cmd = ['count'] let disp = [] @@ -269,7 +269,7 @@ function! s:NM_search_show_thread() if id != '' let words = [id] if exists('b:nm_search_words') - let words = ['('] + b:nm_search_words + [')', 'and', id] + let words = ['('] + b:nm_search_words + [')', 'AND', id] endif if len(words) call NM_cmd_show(words) @@ -323,23 +323,13 @@ endfunction function! s:NM_search_filter_helper(prompt, prefix, joiner) " TODO: input() can support completion - let text = input(a:prompt) + let text = substitute(input(a:prompt), '\v(^\s*|\s*$|\n)', '', 'g') if !strlen(text) return endif - let tags = split(text) - if strlen(a:prefix) - call map(tags, 'a:prefix . v:val') - endif - if strlen(a:joiner) - let idx = len(tags) - 1 - while idx > 0 - call insert(tags, a:joiner, idx) - let idx = idx - 1 - endwhile - endif - let tags = b:nm_search_words + ['and', '('] + tags + [')'] + let tags = b:nm_search_words + ['AND'] + \ + NM_combine_tags(a:prefix, split(text), a:joiner, '()') let prev_bufnr = bufnr('%') setlocal bufhidden=hide @@ -387,7 +377,6 @@ function! s:NM_search_thread_id() if len(b:nm_raw_lines) <= mnum return '' endif - echo 'len=' . string(len(b:nm_raw_lines)) . ' mnum=' . string(mnum) let info = b:nm_raw_lines[mnum] let what = split(info, '\s\+')[0] return what @@ -420,7 +409,7 @@ function! s:NM_cmd_show(words) setlocal bufhidden=hide call NM_newBuffer('', 'show', join(info['disp'], "\n")) setlocal bufhidden=delete - let b:nm_words = a:words + let b:nm_search_words = a:words let b:nm_raw_info = info let b:nm_prev_bufnr = prev_bufnr @@ -539,7 +528,7 @@ function! s:NM_show_advance_marking_read_and_archiving() let msg_top = NM_show_get_message_for_line(vis_top) if !has_key(msg_top,'id') - echo "No top visible message." + throw "No top visible message." endif " if the top message is the last message, just expunge the entire thread and move on @@ -547,14 +536,12 @@ function! s:NM_show_advance_marking_read_and_archiving() let ids = [] for msg in b:nm_raw_info['msgs'] if has_key(msg,'match') && msg['match'] != '0' - if len(ids) - call add(ids, 'OR') - endif call add(ids, msg['id']) endif endfor - - let filter = ['('] + advance_tags + [')', 'AND', '('] + ids + [')'] + let filter = NM_combine_tags('tag:', advance_tags, 'OR', '()') + \ + ['AND'] + \ + NM_combine_tags('', ids, 'OR', '()') call NM_add_remove_tags(filter, '-', advance_tags) call NM_show_next(1, 1) return @@ -562,7 +549,7 @@ function! s:NM_show_advance_marking_read_and_archiving() let msg_bot = NM_show_get_message_for_line(vis_bot) if !has_key(msg_bot,'id') - echo "No bottom visible message." + throw "No bottom visible message." endif " if entire message fits on the screen, read/archive it, move to the next one @@ -573,7 +560,8 @@ function! s:NM_show_advance_marking_read_and_archiving() if has_key(msg_top,'match') && msg_top['match'] != '0' redraw " do this last to hide the latency - let filter = ['('] + advance_tags + [')', 'AND', msg_top['id']] + let filter = NM_combine_tags('tag:', advance_tags, 'OR', '()') + \ + ['AND', msg_top['id']] call NM_add_remove_tags(filter, '-', advance_tags) endif return @@ -629,13 +617,6 @@ function! s:NM_show_message_id() return '' endfunction -function! s:NM_show_search_words() - if !exists('b:nm_words') - throw 'Eeek! no b:nm_words' - endif - return b:nm_words -endfunction - function! s:NM_show_fold_toggle(key, type, fold) let info = b:nm_raw_info let act = 'open' @@ -1051,7 +1032,6 @@ endfunction function! s:NM_compose_next_entry_area() let lnum = line('.') let hdr_end = NM_compose_find_line_match(1,'^$',1) - echo 'header end = ' . string(hdr_end) if lnum < hdr_end let lnum = lnum + 1 let line = getline(lnum) @@ -1227,8 +1207,39 @@ function! s:NM_new_mail() echo 'not implemented' endfunction +" --- tag manipulation helpers {{{1 + +" used to combine an array of words with prefixes and separators +" example: +" NM_combine_tags('tag:', ['one', 'two', 'three'], 'OR', '()') +" -> ['(', 'tag:one', 'OR', 'tag:two', 'OR', 'tag:three', ')'] +function s:NM_combine_tags(word_prefix, words, separator, brackets) + let res = [] + for word in a:words + if len(res) && strlen(a:separator) + call add(res, a:separator) + endif + call add(res, a:word_prefix . word) + endfor + if len(res) > 1 && strlen(a:brackets) + if strlen(a:brackets) != 2 + throw 'Eeek! brackets arg to NM_combine_tags must be 2 chars' + endif + call insert(res, a:brackets[0]) + call add(res, a:brackets[1]) + endif + return res +endfunction + " --- other helpers {{{1 +function! s:NM_get_search_words() + if !exists('b:nm_search_words') + throw 'Eeek! no b:nm_search_words' + endif + return b:nm_search_words +endfunction + function! s:NM_kill_this_buffer() if exists('b:nm_prev_bufnr') let prev_bufnr = b:nm_prev_bufnr @@ -1251,7 +1262,7 @@ endfunction function! s:NM_add_remove_tags(filter, prefix, tags) let filter = len(a:filter) ? a:filter : [NM_search_thread_id()] if !len(filter) - echoe 'Eeek! I couldn''t find the thead id!' + throw 'Eeek! I couldn''t find the thead id!' endif call map(a:tags, 'a:prefix . v:val') let args = ['tag']