X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=b78a638236415f79619d0f1005da5bdaec11c1a8;hp=0151160268a3bdf2015d0835710853ced9cf5a1a;hb=7888bffce748ecfe0b49460bcda6033a4a74a66e;hpb=5c7ebe31d58d649bfb68627d642dde1cc6cf6493 diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index 01511602..b78a6382 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -48,34 +48,44 @@ let s:notmuch_defaults = { \ 'g:notmuch_show_citation_regexp': '^\s*>' , \ } -" for some reason NM_set_defaults() didn't work for arrays... -if !exists('g:notmuch_show_headers') - let g:notmuch_show_headers = [ 'Subject', 'From' ] -endif - -" --- process and set the defaults {{{1 +" defaults for g:notmuch_initial_search_words +" override with: let g:notmuch_initial_search_words = [ ... ] +let s:notmuch_initial_search_words_defaults = [ + \ 'tag:inbox' + \ ] + +" defaults for g:notmuch_show_headers +" override with: let g:notmuch_show_headers = [ ... ] +let s:notmuch_show_headers_defaults = [ + \ 'Subject', + \ 'From' + \ ] + +" --- keyboard mapping definitions {{{1 + +" --- --- bindings for search screen {{{2 +let g:notmuch_search_maps = { + \ '': ':call NM_search_show_thread()', + \ '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()', + \ 't': ':call NM_search_filter_by_tag()', + \ '+': ':call NM_search_add_tags([])', + \ '-': ':call NM_search_remove_tags([])', + \ '=': ':call NM_search_refresh_view()', + \ } -function! NM_set_defaults(force) - for [key, dflt] in items(s:notmuch_defaults) - let cmd = '' - if !a:force && exists(key) && type(dflt) == type(eval(key)) - continue - elseif type(dflt) == type(0) - let cmd = printf('let %s = %d', key, dflt) - elseif type(dflt) == type('') - let cmd = printf('let %s = ''%s''', key, dflt) - "elseif type(dflt) == type([]) - " let cmd = printf('let %s = %s', key, string(dflt)) - else - echoe printf('E: Unknown type in NM_set_defaults(%d) using [%s,%s]', - \ a:force, key, string(dflt)) - continue - endif - echoe cmd - exec cmd - endfor -endfunction -call NM_set_defaults(0) +" --- --- 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)', + \ } " --- implement search screen {{{1 @@ -84,6 +94,7 @@ 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]', '') @@ -94,23 +105,109 @@ function! s:NM_cmd_search(words) call s:NM_newBuffer('search', join(disp, "\n")) let b:nm_raw_lines = lines - nnoremap :call NM_search_display() - nnoremap s :call NM_cmd_search(split(input('NotMuch Search:'))) + call NM_set_map(g:notmuch_search_maps) setlocal cursorline setlocal nowrap endfunction -function! s:NM_search_display() +" --- --- search screen action functions {{{2 + +function! s:NM_search_show_thread() + let id = NM_search_find_thread_id() + if id != '' + call s:NM_cmd_show([id]) + endif +endfunction + +function! s:NM_search_prompt() + " 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() + call NM_search_remove_tags('inbox') + norm j +endfunction + +function! s:NM_search_filter() + echoe 'Not implemented' +endfunction + +function! s:NM_new_mail() + echoe 'Not implemented' +endfunction + +function! s:NM_search_toggle_order() + echoe 'Not implemented' +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 + +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() + let lno = line('.') + call s: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') - echo 'no 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] - call s:NM_cmd_show([what]) + return what endif 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 + endif + call map(tags, 'a:prefix . v:val') + " TODO: handle errors + call NM_run(['tag'] + tags + ['--', id]) + call NM_search_refresh_view() + endif +endfunction " --- implement show screen {{{1 @@ -128,14 +225,15 @@ function! s:NM_cmd_show(words) call s:NM_cmd_show_mkfolds() call s:NM_cmd_show_mksyntax() + call NM_set_map(g:notmuch_show_maps) setlocal foldtext=NM_cmd_show_foldtext() setlocal fillchars= setlocal foldcolumn=6 - exec printf("nnoremap q :b %d", b:nm_prev_bufnr) - nnoremap :call NM_cmd_show_next() - nnoremap c :call NM_cmd_show_fold_toggle('c', 'cit', !g:notmuch_show_fold_citations) - nnoremap s :call NM_cmd_show_fold_toggle('s', 'sig', !g:notmuch_show_fold_signatures) +endfunction + +function! s:NM_cmd_show_quit() + exec printf(":buffer %d", b:nm_prev_bufnr) endfunction function! s:NM_cmd_show_next() @@ -153,7 +251,7 @@ function! s:NM_cmd_show_next() return endfor norm qj - call NM_search_display() + call NM_search_show_thread() endfunction function! s:NM_cmd_show_fold_toggle(key, type, fold) @@ -380,7 +478,7 @@ function! NM_cmd_show_foldtext() endfunction -" --- helper functions {{{1 +" --- notmuch helper functions {{{1 function! s:NM_newBuffer(ft, content) enew @@ -405,12 +503,54 @@ function! s:NM_run(args) endif endfunction +" --- process and set the defaults {{{1 + +function! NM_set_defaults(force) + for [key, dflt] in items(s:notmuch_defaults) + let cmd = '' + if !a:force && exists(key) && type(dflt) == type(eval(key)) + continue + elseif type(dflt) == type(0) + let cmd = printf('let %s = %d', key, dflt) + elseif type(dflt) == type('') + let cmd = printf('let %s = ''%s''', key, dflt) + "elseif type(dflt) == type([]) + " let cmd = printf('let %s = %s', key, string(dflt)) + else + echoe printf('E: Unknown type in NM_set_defaults(%d) using [%s,%s]', + \ a:force, key, string(dflt)) + continue + endif + exec cmd + endfor +endfunction +call NM_set_defaults(0) + +" for some reason NM_set_defaults() didn't work for arrays... +if !exists('g:notmuch_show_headers') + let g:notmuch_show_headers = s:notmuch_show_headers_defaults +endif +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 + +function! s:NM_set_map(maps) + for [key, code] in items(a:maps) + exec printf('nnoremap %s %s', key, code) + endfor +endfunction " --- command handler {{{1 function! NotMuch(args) if !strlen(a:args) - call s:NM_cmd_search(['tag:inbox']) + call s:NM_cmd_search(g:notmuch_current_search_words) return endif