" --- --- bindings for show screen {{{2
let g:notmuch_show_maps = {
- \ '<C-P>': ':call <SID>NM_show_prev()<CR>',
- \ '<C-N>': ':call <SID>NM_show_next()<CR>',
+ \ '<C-P>': ':call <SID>NM_show_previous(1)<CR>',
+ \ '<C-N>': ':call <SID>NM_show_next(1)<CR>',
\ 'q': ':call <SID>NM_kill_this_buffer()<CR>',
\
\ 'b': ':call <SID>NM_show_fold_toggle(''b'', ''bdy'', !g:notmuch_show_fold_bodies)<CR>',
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"))
endfunction
function! s:NM_search_archive_thread()
+ call <SID>NM_add_remove_tags_on_screen('-', ['inbox'])
call <SID>NM_add_remove_tags('-', ['inbox'])
- " TODO: this could be made better and more generic
- setlocal modifiable
- s/(\([^)]*\)\<inbox\>\([^)]*\))$/(\1\2)/
- setlocal nomodifiable
norm j
endfunction
if !strlen(text)
return
endif
- call <SID>NM_add_remove_tags(a:prefix, split(text, ' '))
+ let tags = split(text, ' ')
else
- call <SID>NM_add_remove_tags(a:prefix, a:intags)
- endif
- call <SID>NM_search_refresh_view()
-endfunction
-
-function! s:NM_add_remove_tags(prefix, tags)
- let id = <SID>NM_search_find_thread_id()
- if id == ''
- echoe 'Eeek! I couldn''t find the thead id!'
+ let tags = a:intags
endif
- call map(a:tags, 'a:prefix . v:val')
- " TODO: handle errors
- call <SID>NM_run(['tag'] + a:tags + ['--', id])
+ call <SID>NM_add_remove_tags(a:prefix, tags)
+ call <SID>NM_add_remove_tags_on_screen(a:prefix, tags)
endfunction
" --- implement show screen {{{1
endfunction
-function! s:NM_show_prev()
- echoe "not implemented"
+function! s:NM_show_previous(can_change_thread)
+ let info = b:nm_raw_info
+ let lnum = line('.')
+ for msg in reverse(copy(info['msgs']))
+ if lnum <= msg['start']
+ continue
+ endif
+
+ exec printf('norm %dG', msg['start'])
+ " TODO: try to fit the message on screen
+ norm zz
+ return
+ endfor
+ if !a:can_change_thread
+ return
+ endif
+ call <SID>NM_kill_this_buffer()
+ if line('.') != line('0')
+ norm k
+ call <SID>NM_search_show_thread()
+ norm G
+ call <SID>NM_show_previous(0)
+ else
+ echo 'No more messages.'
+ endif
endfunction
-function! s:NM_show_next()
+function! s:NM_show_next(can_change_thread)
let info = b:nm_raw_info
let lnum = line('.')
- let cnt = 0
for msg in info['msgs']
- let cnt = cnt + 1
if lnum >= msg['start']
continue
endif
exec printf('norm %dG', msg['start'])
+ " TODO: try to fit the message on screen
norm zz
return
endfor
- norm qj
- call <SID>NM_search_show_thread()
+ if !a:can_change_thread
+ return
+ endif
+ call <SID>NM_kill_this_buffer()
+ if line('.') != line('$')
+ norm j
+ call <SID>NM_search_show_thread()
+ else
+ echo 'No more messages.'
+ endif
endfunction
function! s:NM_show_archive_thread()
elseif mode_type == 'cit'
if part_end || match(line, g:notmuch_show_citation_regexp) == -1
let outlnum = len(info['disp'])
- let foldinfo = [ mode_type, mode_start, outlnum-1,
- \ printf('[ %d-line citation. Press "c" to show. ]', outlnum - mode_start) ]
+ 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 mode_type = ''
endif
elseif mode_type == 'sig'
if (outlnum - mode_start) > g:notmuch_show_signature_lines_max
let mode_type = ''
elseif part_end
- let foldinfo = [ mode_type, mode_start, outlnum,
- \ printf('[ %d-line signature. Press "s" to show. ]', outlnum - mode_start) ]
+ 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 mode_type = ''
endif
endif
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) ]
+ \ printf('[ %d-line headers. Press "h" to show. ]', hdr_end + 1 - hdr_start) ]
let msg['header'] = hdr
let in_header = 0
let hdr = {}
function! s:NM_run(args)
let cmd = g:notmuch_cmd . ' ' . join(a:args) . '< /dev/null'
+
+ let start = reltime()
let out = system(cmd)
- if v:shell_error
+ let err = v:shell_error
+ let delta = reltime(start)
+
+ echo printf('[%s] {%s} %s', reltimestr(delta), string(err), string(cmd))
+
+ if err
echohl Error
echo substitute(out, '\n*$', '', '')
echohl None
endif
endfunction
+function! s:NM_add_remove_tags(prefix, tags)
+ let id = <SID>NM_search_find_thread_id()
+ if id == ''
+ echoe 'Eeek! I couldn''t find the thead id!'
+ endif
+ call map(a:tags, 'a:prefix . v:val')
+ " TODO: handle errors
+ call <SID>NM_run(['tag'] + a:tags + ['--', id])
+endfunction
+
+function! s:NM_add_remove_tags_on_screen(prefix, tags)
+ let online = ''
+ setlocal modifiable
+ if a:prefix == '-'
+ for tagname in a:tags
+ exec printf('silent %ss/(\([^)]*\)\<%s\>\([^)]*\))$/(\1\2)/', online, tagname)
+ endfor
+ else
+ for tagname in a:tags
+ exec printf('silent %ss/(\([^)]*\)\([^)]*\))$/(\1 %s)/', online, tagname)
+ endfor
+ endif
+ setlocal nomodifiable
+endfunction
+
" --- process and set the defaults {{{1
function! NM_set_defaults(force)
" --- assign keymaps {{{1
function! s:NM_set_map(maps)
+ nmapclear
for [key, code] in items(a:maps)
exec printf('nnoremap <buffer> %s %s', key, code)
endfor
+ " --- this is a hack for development :)
+ nnoremap ,nmr :source ~/.vim/plugin/notmuch.vim<CR>:call NotMuch('')<CR>
endfunction
" --- command handler {{{1
command! -nargs=* -complete=customlist,CompleteNotMuch NotMuch call NotMuch(<q-args>)
cabbrev notmuch <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'NotMuch' : 'notmuch')<CR>
-" --- hacks, only for development :) {{{1
-
-nnoremap ,nmr :source ~/.vim/plugin/notmuch.vim<CR>:call NotMuch('')<CR>
-
" vim: set ft=vim ts=8 sw=8 et foldmethod=marker :