\ '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>',
+ \ '<C-]>': ':call <SID>NM_search_expand(''<cword>'')<CR>',
\ 'a': ':call <SID>NM_search_archive_thread()<CR>',
\ 'f': ':call <SID>NM_search_filter()<CR>',
\ 'm': ':call <SID>NM_new_mail()<CR>',
\ 'o': ':call <SID>NM_search_toggle_order()<CR>',
\ 'r': ':call <SID>NM_search_reply_to_thread()<CR>',
\ 's': ':call <SID>NM_search_prompt()<CR>',
- \ 'S': ':call <SID>NM_search_edit()<CR>',
+ \ ',s': ':call <SID>NM_search_edit()<CR>',
\ 't': ':call <SID>NM_search_filter_by_tag()<CR>',
\ 'q': ':call <SID>NM_kill_this_buffer()<CR>',
\ '+': ':call <SID>NM_search_add_tags([])<CR>',
\ '-': ':call <SID>NM_search_remove_tags([])<CR>',
\ '=': ':call <SID>NM_search_refresh_view()<CR>',
+ \ '?': ':echo <SID>NM_search_thread_id()<CR>',
\ }
" --- --- bindings for show screen {{{2
let g:notmuch_show_maps = {
\ '<C-P>': ':call <SID>NM_show_previous(1)<CR>',
\ '<C-N>': ':call <SID>NM_show_next(1)<CR>',
+ \ '<C-]>': ':call <SID>NM_search_expand(''<cword>'')<CR>',
\ 'q': ':call <SID>NM_kill_this_buffer()<CR>',
\
\ 'b': ':call <SID>NM_show_fold_toggle(''b'', ''bdy'', !g:notmuch_show_fold_bodies)<CR>',
\
\ 'r': ':call <SID>NM_show_reply()<CR>',
\ 'm': ':call <SID>NM_new_mail()<CR>',
+ \ '?': ':echo <SID>NM_show_thread_id() . '' '' . <SID>NM_show_message_id()<CR>',
\ }
+" --- 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)
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
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
function! s:NM_search_show_thread()
- let id = <SID>NM_search_find_thread_id()
+ let id = <SID>NM_search_thread_id()
if id != ''
call <SID>NM_cmd_show([id])
endif
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()
" --- --- search screen helper functions {{{2
-function! s:NM_search_find_thread_id()
+function! s:NM_search_thread_id()
if !exists('b:nm_raw_lines')
echoe 'no b:nm_raw_lines'
return ''
setlocal bufhidden=hide
call <SID>NM_newBuffer('show', join(info['disp'], "\n"))
setlocal bufhidden=delete
+ let b:nm_words = a:words
let b:nm_raw_info = info
let b:nm_prev_bufnr = prev_bufnr
echo 'not implemented'
endfunction
-" --- --- search screen helper functions {{{2
+" --- --- show screen helper functions {{{2
+
+function! s:NM_show_thread_id()
+ if !exists('b:nm_words')
+ echoe 'no b:nm_words'
+ return ''
+ endif
+ return b:nm_words[0]
+endfunction
+
+function! s:NM_show_message_id()
+ if !exists('b:nm_raw_info')
+ echoe 'no b:nm_raw_info'
+ return ''
+ endif
+ let info = b:nm_raw_info
+ let lnum = line('.')
+ for msg in info['msgs']
+ if lnum < msg['start']
+ continue
+ endif
+
+ return msg['id']
+ endfor
+ return ''
+endfunction
function! s:NM_show_fold_toggle(key, type, fold)
let info = b:nm_raw_info
elseif mode_type == 'cit'
if part_end || match(line, g:notmuch_show_citation_regexp) == -1
let outlnum = len(info['disp'])
- if mode_start != outlnum
- let foldinfo = [ mode_type, mode_start, outlnum-1,
- \ printf('[ %d-line citation. Press "c" to show. ]', outlnum - mode_start) ]
- endif
+ let foldinfo = [ mode_type, mode_start, outlnum-1,
+ \ printf('[ %d-line citation. Press "c" to show. ]', outlnum - mode_start) ]
let mode_type = ''
endif
elseif mode_type == 'sig'
if (outlnum - mode_start) > g:notmuch_show_signature_lines_max
let mode_type = ''
elseif part_end
- if mode_start != outlnum
- let foldinfo = [ mode_type, mode_start, outlnum-1,
- \ printf('[ %d-line signature. Press "s" to show. ]', outlnum - mode_start) ]
- endif
+ let foldinfo = [ mode_type, mode_start, outlnum-1,
+ \ printf('[ %d-line signature. Press "s" to show. ]', outlnum - mode_start) ]
let mode_type = ''
endif
endif
if part_end
" FIXME: this is a hack for handling two folds being added for one line
" we should handle addinga fold in a function
- if len(foldinfo)
+ if len(foldinfo) && foldinfo[1] < foldinfo[2]
call add(info['folds'], foldinfo[0:2])
let info['foldtext'][foldinfo[1]] = foldinfo[3]
endif
endif
endif
- if len(foldinfo)
+ if len(foldinfo) && foldinfo[1] < foldinfo[2]
call add(info['folds'], foldinfo[0:2])
let info['foldtext'][foldinfo[1]] = foldinfo[3]
endif
" --- 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)
endif
endfunction
+function! s:NM_search_expand(arg)
+ let word = expand(a:arg)
+ let prev_bufnr = bufnr('%')
+ setlocal bufhidden=hide
+ call <SID>NM_cmd_search([word])
+ setlocal bufhidden=delete
+ let b:nm_prev_bufnr = prev_bufnr
+endfunction
+
function! s:NM_add_remove_tags(prefix, tags)
- let id = <SID>NM_search_find_thread_id()
+ let id = <SID>NM_search_thread_id()
if id == ''
echoe 'Eeek! I couldn''t find the thead id!'
endif
let cmd = printf('let %s = %d', key, dflt)
elseif type(dflt) == type('')
let cmd = printf('let %s = ''%s''', key, dflt)
+ " FIXME: not sure why this didn't work when dflt is an array
"elseif type(dflt) == type([])
" let cmd = printf('let %s = %s', key, string(dflt))
else
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
" --- 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 []