add notmuch-folders support mode
authorBart Trojanowski <bart@jukie.net>
Sun, 22 Nov 2009 03:24:54 +0000 (22:24 -0500)
committerBart Trojanowski <bart@jukie.net>
Wed, 25 Nov 2009 05:48:53 +0000 (00:48 -0500)
vim/README
vim/plugin/notmuch.vim
vim/syntax/notmuch-folders.vim [new file with mode: 0644]

index 207799942a2a4e5349a58bf0925dc6579b94f10b..e4ad4eaa54d0b31ea92e6bb7342165602c3d23f4 100644 (file)
@@ -13,6 +13,12 @@ To run:
         :NotMuch
 
 Buffer types:
+    [notmuch-folders]
+        Folder list, or technically a list of saved searches.
+
+        Keybindings:
+            <Enter> - 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
index dfa4c432faca9d12c8693063f5ec2382e45fc862..f134e6522e327db068479317f734e7d16e15a663 100644 (file)
@@ -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 <SID>NM_folders_notmuch_search()<CR>',
+        \ 'q':          ':call <SID>NM_kill_this_buffer()<CR>',
+        \ '<':          ':call <SID>NM_folders_beginning_of_buffer()<CR>',
+        \ '=':          ':call <SID>NM_folders_refresh_view()<CR>',
+        \ '<Enter>':    ':call <SID>NM_folders_show_search()<CR>',
+        \ }
+
 " --- --- bindings for search screen {{{2
 let g:notmuch_search_maps = {
         \ '<Enter>':    ':call <SID>NM_search_show_thread()<CR>',
@@ -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 <SID>NM_newBuffer('folders', join(disp, "\n"))
+        let b:nm_searches = searches
+        let b:nm_timestamp = reltime()
+
+        call <SID>NM_cmd_folders_mksyntax()
+        call <SID>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 <SID>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 <SID>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 <SID>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 (file)
index 0000000..9477f86
--- /dev/null
@@ -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
+