]> git.notmuchmail.org Git - notmuch/blobdiff - vim/plugin/notmuch.vim
vim: place ... more inteligently when shortening 'from' list in search
[notmuch] / vim / plugin / notmuch.vim
index 756472c4775ad0feb9991e7b618fc03f13510150..9cee5008f7848a4835649027dd399d329a28f6b8 100644 (file)
@@ -69,8 +69,25 @@ 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_search_prompt()<CR>',
+        \ 'q':          ':call <SID>NM_kill_this_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 +130,57 @@ 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_refresh_view()
+        let lno = line('.')
+        setlocal bufhidden=delete
+        call s:NM_cmd_folders([])
+        exec printf('norm %dG', lno)
+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)
@@ -123,11 +191,8 @@ function! s:NM_cmd_search(words)
                 let cmd = cmd + ['--sort=oldest-first']
         endif
         let data = s:NM_run(cmd + a:words)
-        "let data = substitute(data, '27/27', '25/27', '')
-        "let data = substitute(data, '\[4/4\]', '[0/4]', '')
         let lines = split(data, "\n")
         let disp = copy(lines)
-        "call map(disp, 'substitute(v:val, "^thread:\\S* ", "", "")' )
         call map(disp, 's:NM_cmd_search_fmtline(v:val)')
 
         call <SID>NM_newBuffer('search', join(disp, "\n"))
@@ -147,7 +212,7 @@ 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])
 endfunction
@@ -176,8 +241,18 @@ function! s:NM_search_prompt()
         else
                 let tags = s:notmuch_initial_search_words_defaults
         endif
-        setlocal bufhidden=delete
+        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
+                let prev_bufnr = bufnr('%')
+                setlocal bufhidden=hide
+        endif
         call <SID>NM_cmd_search(tags)
+        setlocal bufhidden=delete
+        let b:nm_prev_bufnr = prev_bufnr
 endfunction
 
 function! s:NM_search_edit()
@@ -638,14 +713,15 @@ endfunction
 
 " --- notmuch helper functions {{{1
 
-function! s:NM_newBuffer(ft, content)
+function! s:NM_newBuffer(type, content)
         enew
         setlocal buftype=nofile readonly modifiable
         silent put=a:content
         keepjumps 0d
         setlocal nomodifiable
-        execute printf('set filetype=notmuch-%s', a:ft)
-        execute printf('set syntax=notmuch-%s', a:ft)
+        execute printf('set filetype=notmuch-%s', a:type)
+        execute printf('set syntax=notmuch-%s', a:type)
+        let b:nm_type = a:type
 endfunction
 
 function! s:NM_run(args)
@@ -740,6 +816,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
@@ -756,20 +835,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 []