X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=3ceefe58f411fefa3339a75db379dd0769066949;hp=308fc05d8010094bffe66678d54ceecfbc7301cf;hb=9d9b03c837edde2aaed1cd9f8472d2be45c406bf;hpb=5a9d5fb20091a34efdf6716d4481799097ec9269 diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index 308fc05d..3ceefe58 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -23,6 +23,7 @@ let s:notmuch_defaults = { \ 'g:notmuch_cmd': 'notmuch' , + \ 'g:notmuch_debug': 0 , \ \ 'g:notmuch_search_newest_first': 1 , \ 'g:notmuch_search_from_column_width': 20 , @@ -91,24 +92,27 @@ let g:notmuch_folders_maps = { " --- --- bindings for search screen {{{2 let g:notmuch_search_maps = { \ '': ':call NM_search_show_thread()', + \ '': ':call NM_search_expand('''')', \ 'a': ':call NM_search_archive_thread()', \ 'f': ':call NM_search_filter()', \ 'm': ':call NM_new_mail()', \ 'o': ':call NM_search_toggle_order()', \ 'r': ':call NM_search_reply_to_thread()', \ 's': ':call NM_search_prompt()', - \ 'S': ':call NM_search_edit()', + \ ',s': ':call NM_search_edit()', \ 't': ':call NM_search_filter_by_tag()', \ 'q': ':call NM_kill_this_buffer()', \ '+': ':call NM_search_add_tags([])', \ '-': ':call NM_search_remove_tags([])', \ '=': ':call NM_search_refresh_view()', + \ '?': ':echo NM_search_thread_id()', \ } " --- --- bindings for show screen {{{2 let g:notmuch_show_maps = { \ '': ':call NM_show_previous(1)', \ '': ':call NM_show_next(1)', + \ '': ':call NM_search_expand('''')', \ 'q': ':call NM_kill_this_buffer()', \ \ 'b': ':call NM_show_fold_toggle(''b'', ''bdy'', !g:notmuch_show_fold_bodies)', @@ -125,8 +129,13 @@ let g:notmuch_show_maps = { \ '': ':call NM_show_advance_marking_read_and_archiving()', \ '\|': ':call NM_show_pipe_message()', \ + \ '': ':call NM_show_previous_fold()', + \ '': ':call NM_show_next_fold()', + \ '': ':call NM_show_toggle_fold()', + \ \ 'r': ':call NM_show_reply()', \ 'm': ':call NM_new_mail()', + \ '?': ':echo NM_show_message_id() . '' @ '' . join(NM_show_search_words())', \ } @@ -212,24 +221,27 @@ function! s:NM_cmd_search_fmtline(line) let max = g:notmuch_search_from_column_width let from = m[3] if strlen(from) >= max - let from = m[3][0:max-4] . '...' + let from = substitute(m[3][0:max-4], '[^A-Za-z1-9_]*$', '', '') . '...' endif - return printf('%s %-20s | %s (%s)', m[2], from, m[4], m[5]) + return printf('%-20s %-20s | %s (%s)', m[2], from, m[4], m[5]) endfunction function! s:NM_cmd_search_mksyntax() syntax clear nmSearchFrom - "syntax region nmSearchFrom start='\]\@<=' end='.'me=e+5,he=e+5,re=e+5 oneline contained - "syntax match nmSearchFrom /\]\@<=.\{10\}/ oneline contained exec printf('syntax match nmSearchFrom /\(\] \)\@<=.\{%d\}/ oneline contained', g:notmuch_search_from_column_width) - "exec printf('syntax region nmSearchFrom start=''\%%%dv'' end=''\%%%dv'' oneline contained', 20, 30) endfunction " --- --- search screen action functions {{{2 function! s:NM_search_show_thread() - let id = NM_search_find_thread_id() + let id = NM_search_thread_id() if id != '' - call NM_cmd_show([id]) + let words = [id] + if exists('b:nm_search_words') + let words = ['('] + b:nm_search_words + [')', 'and', id] + endif + if len(words) + call NM_cmd_show(words) + endif endif endfunction @@ -245,6 +257,7 @@ function! s:NM_search_prompt() if b:nm_type == 'search' " TODO: we intend to replace the current buffer, " ... maybe we could just clear it + let prev_bufnr = b:nm_prev_bufnr setlocal bufhidden=delete else setlocal bufhidden=hide @@ -269,14 +282,14 @@ function! s:NM_search_archive_thread() endfunction function! s:NM_search_filter() - call NM_search_filter_helper('Filter: ', '') + call NM_search_filter_helper('Filter: ', '', '') endfunction function! s:NM_search_filter_by_tag() - call NM_search_filter_helper('Filter Tag(s): ', 'tag:') + call NM_search_filter_helper('Filter Tag(s): ', 'tag:', 'and') endfunction -function! s:NM_search_filter_helper(prompt, prefix) +function! s:NM_search_filter_helper(prompt, prefix, joiner) " TODO: input() can support completion let text = input(a:prompt) if !strlen(text) @@ -284,9 +297,17 @@ function! s:NM_search_filter_helper(prompt, prefix) endif let tags = split(text) - map(tags, 'and a:prefix . v:val') - let tags = b:nm_search_words + tags - echo tags + 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 prev_bufnr = bufnr('%') setlocal bufhidden=hide @@ -316,15 +337,17 @@ endfunction function! s:NM_search_refresh_view() let lno = line('.') + let prev_bufnr = b:nm_prev_bufnr setlocal bufhidden=delete call NM_cmd_search(b:nm_search_words) + let b:nm_prev_bufnr = prev_bufnr " 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() +function! s:NM_search_thread_id() if !exists('b:nm_raw_lines') echoe 'no b:nm_raw_lines' return '' @@ -363,6 +386,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_raw_info = info let b:nm_prev_bufnr = prev_bufnr @@ -475,7 +499,47 @@ function! s:NM_show_pipe_message() echo 'not implemented' endfunction -" --- --- search screen helper functions {{{2 +function! s:NM_show_previous_fold() + echo 'not implemented' +endfunction + +function! s:NM_show_next_fold() + echo 'not implemented' +endfunction + +function! s:NM_show_toggle_fold() + echo 'not implemented' +endfunction + + +" --- --- show screen helper functions {{{2 + +function! s:NM_show_message_id() + if !exists('b:nm_raw_info') + echoe 'no b:nm_raw_info' + return '' + endif + let info = b:nm_raw_info + let lnum = line('.') + for msg in info['msgs'] + if lnum > msg['end'] + continue + endif + if has_key(msg,'id') + return msg['id'] + endif + return '' + endfor + return '' +endfunction + +function! s:NM_show_search_words() + if !exists('b:nm_words') + echoe 'no b:nm_words' + return [] + endif + return b:nm_words +endfunction function! s:NM_show_fold_toggle(key, type, fold) let info = b:nm_raw_info @@ -542,10 +606,8 @@ function! s:NM_cmd_show_parse(inlines) elseif mode_type == 'cit' if part_end || match(line, g:notmuch_show_citation_regexp) == -1 let outlnum = len(info['disp']) - if mode_start != outlnum - let foldinfo = [ mode_type, mode_start, outlnum-1, - \ printf('[ %d-line citation. Press "c" to show. ]', outlnum - mode_start) ] - endif + let foldinfo = [ mode_type, mode_start, outlnum-1, + \ printf('[ %d-line citation. Press "c" to show. ]', outlnum - mode_start) ] let mode_type = '' endif elseif mode_type == 'sig' @@ -553,10 +615,8 @@ function! s:NM_cmd_show_parse(inlines) if (outlnum - mode_start) > g:notmuch_show_signature_lines_max let mode_type = '' elseif part_end - 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 foldinfo = [ mode_type, mode_start, outlnum-1, + \ printf('[ %d-line signature. Press "s" to show. ]', outlnum - mode_start) ] let mode_type = '' endif endif @@ -565,7 +625,7 @@ function! s:NM_cmd_show_parse(inlines) if part_end " FIXME: this is a hack for handling two folds being added for one line " we should handle addinga fold in a function - if len(foldinfo) + if len(foldinfo) && foldinfo[1] < foldinfo[2] call add(info['folds'], foldinfo[0:2]) let info['foldtext'][foldinfo[1]] = foldinfo[3] endif @@ -665,7 +725,7 @@ function! s:NM_cmd_show_parse(inlines) endif endif - if len(foldinfo) + if len(foldinfo) && foldinfo[1] < foldinfo[2] call add(info['folds'], foldinfo[0:2]) let info['foldtext'][foldinfo[1]] = foldinfo[3] endif @@ -723,15 +783,24 @@ function! s:NM_newBuffer(type, content) let b:nm_type = a:type endfunction +function! s:NM_shell_escape(word) + let word = substitute(a:word, '''', '\\''', 'g') + return '''' . word . '''' +endfunction + function! s:NM_run(args) - let cmd = g:notmuch_cmd . ' ' . join(a:args) . '< /dev/null' + let words = a:args + call map(words, 's:NM_shell_escape(v:val)') + let cmd = g:notmuch_cmd . ' ' . join(words) . '< /dev/null' let start = reltime() let out = system(cmd) let err = v:shell_error let delta = reltime(start) - echo printf('[%s] {%s} %s', reltimestr(delta), string(err), string(cmd)) + if exists('g:notmuch_debug') && g:notmuch_debug + echo printf('[%s] {%s} %s', reltimestr(delta), string(err), string(cmd)) + endif if err echohl Error @@ -756,12 +825,21 @@ function! s:NM_kill_this_buffer() setlocal bufhidden=delete exec printf(":buffer %d", b:nm_prev_bufnr) else - echo "Nothing to kill." + echo "This is the last buffer; use :q to quit." endif endfunction +function! s:NM_search_expand(arg) + let word = expand(a:arg) + let prev_bufnr = bufnr('%') + setlocal bufhidden=hide + call NM_cmd_search([word]) + setlocal bufhidden=delete + let b:nm_prev_bufnr = prev_bufnr +endfunction + function! s:NM_add_remove_tags(prefix, tags) - let id = NM_search_find_thread_id() + let id = NM_search_thread_id() if id == '' echoe 'Eeek! I couldn''t find the thead id!' endif @@ -796,6 +874,7 @@ function! NM_set_defaults(force) let cmd = printf('let %s = %d', key, dflt) elseif type(dflt) == type('') let cmd = printf('let %s = ''%s''', key, dflt) + " FIXME: not sure why this didn't work when dflt is an array "elseif type(dflt) == type([]) " let cmd = printf('let %s = %s', key, string(dflt)) else