From 33c896dd717b73dda48b0e4543aaf4376c57c44a Mon Sep 17 00:00:00 2001 From: Bart Trojanowski Date: Sat, 21 Nov 2009 22:24:54 -0500 Subject: [PATCH] add notmuch-folders support mode --- vim/README | 9 ++- vim/plugin/notmuch.vim | 105 ++++++++++++++++++++++++++++++--- vim/syntax/notmuch-folders.vim | 12 ++++ 3 files changed, 117 insertions(+), 9 deletions(-) create mode 100644 vim/syntax/notmuch-folders.vim diff --git a/vim/README b/vim/README index 20779994..e4ad4eaa 100644 --- a/vim/README +++ b/vim/README @@ -13,6 +13,12 @@ To run: :NotMuch Buffer types: + [notmuch-folders] + Folder list, or technically a list of saved searches. + + Keybindings: + - show the selected search + [notmuch-search] You are presented with the search results when you run :NotMuch. @@ -23,7 +29,8 @@ Buffer types: o - toggle search screen order s - enter search criteria S - alter search criteria - f - filter the current search terms with tags + t - filter the current search terms with tags + q - return to folder display, or undo filter + - add tag(s) to selected message - - remove tag(s) from selected message = - refresh display diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index dfa4c432..f134e652 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -69,8 +69,26 @@ let s:notmuch_show_headers_defaults = [ \ 'Date', \ ] +" defaults for g:notmuch_folders +" override with: let g:notmuch_folders = [ ... ] +let s:notmuch_folders_defaults = [ + \ [ 'new', 'tag:inbox and tag:unread' ], + \ [ 'inbox', 'tag:inbox' ], + \ [ 'unread', 'tag:unread' ], + \ ] + " --- keyboard mapping definitions {{{1 +" --- --- bindings for folders mode {{{2 + +let g:notmuch_folders_maps = { + \ 's': ':call NM_folders_notmuch_search()', + \ 'q': ':call NM_kill_this_buffer()', + \ '<': ':call NM_folders_beginning_of_buffer()', + \ '=': ':call NM_folders_refresh_view()', + \ '': ':call NM_folders_show_search()', + \ } + " --- --- bindings for search screen {{{2 let g:notmuch_search_maps = { \ '': ':call NM_search_show_thread()', @@ -113,6 +131,66 @@ let g:notmuch_show_maps = { \ } +" --- implement folders screen {{{1 + +function! s:NM_cmd_folders(words) + if len(a:words) + echoe 'Not exapecting any arguments for folders command.' + endif + let cmd = ['count'] + let disp = [] + let searches = [] + for entry in g:notmuch_folders + let [ name, search ] = entry + let data = s:NM_run(cmd + [search]) + let cnt = matchlist(data, '\(\d\+\)')[1] + call add(disp, printf('%9d %-20s (%s)', cnt, name, search)) + call add(searches, search) + endfor + + call NM_newBuffer('folders', join(disp, "\n")) + let b:nm_searches = searches + let b:nm_timestamp = reltime() + + call NM_cmd_folders_mksyntax() + call NM_set_map(g:notmuch_folders_maps) + setlocal cursorline + setlocal nowrap +endfunction + +function! s:NM_cmd_folders_mksyntax() +endfunction + +" --- --- folders screen action functions {{{2 + +function! s:NM_folders_notmuch_search() + echo 'not implemented' +endfunction + +function! s:NM_kill_this_buffer() + echo 'not implemented' +endfunction + +function! s:NM_folders_beginning_of_buffer() + echo 'not implemented' +endfunction + +function! s:NM_folders_notmuch_folder() + echo 'not implemented' +endfunction + +function! s:NM_folders_show_search() + let line = line('.') + let search = b:nm_searches[line-1] + + let prev_bufnr = bufnr('%') + setlocal bufhidden=hide + call NM_cmd_search([search]) + setlocal bufhidden=delete + let b:nm_prev_bufnr = prev_bufnr +endfunction + + " --- implement search screen {{{1 function! s:NM_cmd_search(words) @@ -737,6 +815,9 @@ endif if !exists('g:notmuch_initial_search_words') let g:notmuch_initial_search_words = s:notmuch_initial_search_words_defaults endif +if !exists('g:notmuch_folders') + let g:notmuch_folders = s:notmuch_folders_defaults +endif " --- assign keymaps {{{1 @@ -753,20 +834,28 @@ endfunction " --- command handler {{{1 function! NotMuch(args) - if !strlen(a:args) - if exists('b:nm_search_words') + let args = a:args + if !strlen(args) + let args = 'folders' + endif + + let words = split(args) + if words[0] == 'folders' + let words = words[1:] + call NM_cmd_folders(words) + elseif words[0] == 'search' + if len(words) > 1 + let words = words[1:] + elseif 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 - echo "blarg!" - - let words = split(a:args) - " TODO: handle commands passed as arguments + elseif words[0] == 'show' + echoe 'show is not yet implemented.' + endif endfunction function! CompleteNotMuch(arg_lead, cmd_line, cursor_pos) return [] diff --git a/vim/syntax/notmuch-folders.vim b/vim/syntax/notmuch-folders.vim new file mode 100644 index 00000000..9477f86f --- /dev/null +++ b/vim/syntax/notmuch-folders.vim @@ -0,0 +1,12 @@ +" notmuch folders mode syntax file + +syntax region nmFoldersCount start='^' end='\%10v' +syntax region nmFoldersName start='\%11v' end='\%31v' +syntax match nmFoldersSearch /([^()]\+)$/ + +highlight link nmFoldersCount Statement +highlight link nmFoldersName Type +highlight link nmFoldersSearch String + +highlight CursorLine term=reverse cterm=reverse gui=reverse + -- 2.26.2