]> git.notmuchmail.org Git - notmuch/blobdiff - vim/plugin/notmuch.vim
implemented folding bodies and headers
[notmuch] / vim / plugin / notmuch.vim
index dbe198539299364ced8f3bf8706af2ea1b273059..4a4a2016f4725cc7f2b21a4ca09617eaa0d15fe1 100644 (file)
 
 let s:notmuch_defaults = {
         \ 'g:notmuch_cmd':                           'notmuch'                    ,
-        \ 'g:notmuch_search_reverse':                1                            ,
+        \
+        \ 'g:notmuch_search_newest_first':           1                            ,
+        \ 'g:notmuch_search_from_column_width':      20                           ,
+        \
         \ 'g:notmuch_show_fold_signatures':          1                            ,
         \ 'g:notmuch_show_fold_citations':           1                            ,
+        \ 'g:notmuch_show_fold_bodies':              0                            ,
+        \ 'g:notmuch_show_fold_headers':             1                            ,
         \
         \ 'g:notmuch_show_message_begin_regexp':     '^\fmessage{'                ,
         \ 'g:notmuch_show_message_end_regexp':       '^\fmessage}'                ,
@@ -58,7 +63,10 @@ let s:notmuch_initial_search_words_defaults = [
 " override with: let g:notmuch_show_headers = [ ... ]
 let s:notmuch_show_headers_defaults = [
         \ 'Subject',
-        \ 'From'
+        \ 'To',
+        \ 'Cc',
+        \ 'Bcc',
+        \ 'Date'
         \ ]
 
 " --- keyboard mapping definitions {{{1
@@ -82,8 +90,11 @@ let g:notmuch_search_maps = {
 
 " --- --- bindings for show screen {{{2
 let g:notmuch_show_maps = {
+        \ '<C-P>':      ':call <SID>NM_cmd_show_prev()<CR>',
         \ '<C-N>':      ':call <SID>NM_cmd_show_next()<CR>',
+        \ 'b':          ':call <SID>NM_cmd_show_fold_toggle(''b'', ''bdy'', !g:notmuch_show_fold_bodies)<CR>',
         \ 'c':          ':call <SID>NM_cmd_show_fold_toggle(''c'', ''cit'', !g:notmuch_show_fold_citations)<CR>',
+        \ 'h':          ':call <SID>NM_cmd_show_fold_toggle(''h'', ''hdr'', !g:notmuch_show_fold_headers)<CR>',
         \ 's':          ':call <SID>NM_cmd_show_fold_toggle(''s'', ''sig'', !g:notmuch_show_fold_signatures)<CR>',
         \ 'q':          ':call <SID>NM_kill_buffer()<CR>',
         \ }
@@ -92,24 +103,47 @@ let g:notmuch_show_maps = {
 
 function! s:NM_cmd_search(words)
         let cmd = ['search']
-        if g:notmuch_search_reverse
-                let cmd = cmd + ['--reverse']
+        if g:notmuch_search_newest_first
+                let cmd = cmd + ['--sort=newest-first']
+        else
+                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, 'substitute(v:val, "^thread:\\S* ", "", "")' )
+        call map(disp, 's:NM_cmd_search_fmtline(v:val)')
 
         call <SID>NM_newBuffer('search', join(disp, "\n"))
         let b:nm_raw_lines = lines
         let b:nm_search_words = a:words
 
+        call <SID>NM_cmd_search_mksyntax()
         call <SID>NM_set_map(g:notmuch_search_maps)
         setlocal cursorline
         setlocal nowrap
 endfunction
+function! s:NM_cmd_search_fmtline(line)
+        let m = matchlist(a:line, '^\(thread:\S\+\)\s\([^]]\+\]\) \([^;]\+\); \(.*\) (\([^(]*\))$')
+        if !len(m)
+                return 'ERROR PARSING: ' . a:line
+        endif
+        let max = g:notmuch_search_from_column_width
+        let from = m[3]
+        if strlen(from) >= max
+                let from = m[3][0:max-4] . '...'
+        endif
+        return printf('%s %-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
 
@@ -165,7 +199,7 @@ function! s:NM_search_filter_helper(prompt, prefix)
         endif
 
         let tags = split(text)
-        map(tags, 'a:prefix . v:val')
+        map(tags, 'and a:prefix . v:val')
         let tags = b:nm_search_words + tags
         echo tags
 
@@ -181,7 +215,10 @@ function! s:NM_new_mail()
 endfunction
 
 function! s:NM_search_toggle_order()
-        echoe 'Not implemented'
+        let g:notmuch_search_newest_first = !g:notmuch_search_newest_first
+        " FIXME: maybe this would be better done w/o reading re-reading the lines
+        "         reversing the b:nm_raw_lines and the buffer lines would be better
+        call <SID>NM_search_refresh_view()
 endfunction
 
 function! s:NM_search_reply_to_thread()
@@ -198,6 +235,7 @@ endfunction
 
 function! s:NM_search_refresh_view()
         let lno = line('.')
+        setlocal bufhidden=delete
         call <SID>NM_cmd_search(b:nm_search_words)
         " FIXME: should find the line of the thread we were on if possible
         exec printf('norm %dG', lno)
@@ -224,9 +262,9 @@ function! s:NM_search_add_remove_tags(prompt, prefix, intags)
                 if !strlen(text)
                         return
                 endif
-                call <SID>NM_add_remove_tags(prefix, split(text, ' '))
+                call <SID>NM_add_remove_tags(a:prefix, split(text, ' '))
         else
-                call <SID>NM_add_remove_tags(prefix, a:intags)
+                call <SID>NM_add_remove_tags(a:prefix, a:intags)
         endif
         call <SID>NM_search_refresh_view()
 endfunction
@@ -274,6 +312,10 @@ function! s:NM_kill_buffer()
         endif
 endfunction
 
+function! s:NM_cmd_show_prev()
+        echoe "not implemented"
+endfunction
+
 function! s:NM_cmd_show_next()
         let info = b:nm_raw_info
         let lnum = line('.')
@@ -364,7 +406,6 @@ function! s:NM_cmd_show_parse(inlines)
                                 elseif mode_type == 'sig'
                                         let outlnum = len(info['disp'])
                                         if (outlnum - mode_start) > g:notmuch_show_signature_lines_max
-                                                echoe 'line ' . outlnum . ' stopped matching'
                                                 let mode_type = ''
                                         elseif part_end
                                                 let foldinfo = [ mode_type, mode_start, outlnum,
@@ -394,7 +435,7 @@ function! s:NM_cmd_show_parse(inlines)
                         endif
                         if match(line, g:notmuch_show_body_end_regexp) != -1
                                 let body_end = len(info['disp'])
-                                let foldinfo = [ 'body', body_start, body_end,
+                                let foldinfo = [ 'bdy', body_start, body_end,
                                                \ printf('[ BODY %d - %d lines ]', len(info['msgs']), body_end - body_start) ]
 
                                 let in_body = 0
@@ -419,6 +460,10 @@ function! s:NM_cmd_show_parse(inlines)
 
                         else
                                 if match(line, g:notmuch_show_header_end_regexp) != -1
+                                        let hdr_start = msg['hdr_start']+1
+                                        let hdr_end = len(info['disp'])
+                                        let foldinfo = [ 'hdr', hdr_start, hdr_end,
+                                               \ printf('[ %d-line headers.  Press "h" to show. ]', hdr_end - hdr_start) ]
                                         let msg['header'] = hdr
                                         let in_header = 0
                                         let hdr = {}
@@ -438,7 +483,7 @@ function! s:NM_cmd_show_parse(inlines)
                                 let msg['end'] = len(info['disp'])
                                 call add(info['disp'], '')
 
-                                let foldinfo = [ 'match', msg['start'], msg['end'],
+                                let foldinfo = [ 'msg', msg['start'], msg['end'],
                                                \ printf('[ MSG %d - %s ]', len(info['msgs']), msg['descr']) ]
 
                                 call add(info['msgs'], msg)
@@ -488,6 +533,8 @@ function! s:NM_cmd_show_mkfolds()
                 exec printf('%d,%dfold', afold[1], afold[2])
                 if (afold[0] == 'sig' && g:notmuch_show_fold_signatures)
                  \ || (afold[0] == 'cit' && g:notmuch_show_fold_citations)
+                 \ || (afold[0] == 'bdy' && g:notmuch_show_fold_bodies)
+                 \ || (afold[0] == 'hdr' && g:notmuch_show_fold_headers)
                         exec printf('%dfoldclose', afold[1])
                 else
                         exec printf('%dfoldopen', afold[1])