let b:nm_timestamp = reltime()
call <SID>NM_cmd_folders_mksyntax()
- call <SID>NM_set_map(g:notmuch_folders_maps)
+ call <SID>NM_set_map('n', g:notmuch_folders_maps)
setlocal cursorline
setlocal nowrap
endfunction
let b:nm_search_words = a:words
call <SID>NM_cmd_search_mksyntax()
- call <SID>NM_set_map(g:notmuch_search_maps)
+ call <SID>NM_set_map('n', g:notmuch_search_maps)
setlocal cursorline
setlocal nowrap
endfunction
let tags = s:notmuch_initial_search_words_defaults
endif
let prev_bufnr = bufnr('%')
- if b:nm_type == 'search'
+ if b:nm_type == 'search' && exists('b:nm_prev_bufnr')
" TODO: we intend to replace the current buffer,
" ... maybe we could just clear it
let prev_bufnr = b:nm_prev_bufnr
if !exists('b:nm_raw_lines')
echoe 'no b:nm_raw_lines'
return ''
- else
- let line = line('.')
- let info = b:nm_raw_lines[line-1]
- let what = split(info, '\s\+')[0]
- return what
endif
+ let mnum = line('.') - 1
+ if len(b:nm_raw_lines) <= mnum
+ return ''
+ endif
+ echo 'len=' . string(len(b:nm_raw_lines)) . ' mnum=' . string(mnum)
+ let info = b:nm_raw_lines[mnum]
+ let what = split(info, '\s\+')[0]
+ return what
endfunction
function! s:NM_search_add_remove_tags(prompt, prefix, intags)
call <SID>NM_cmd_show_mkfolds()
call <SID>NM_cmd_show_mksyntax()
- call <SID>NM_set_map(g:notmuch_show_maps)
+ call <SID>NM_set_map('n', g:notmuch_show_maps)
setlocal foldtext=NM_cmd_show_foldtext()
setlocal fillchars=
setlocal foldcolumn=6
echo 'not implemented'
endfunction
+" if entire message is not visible scroll down 1/2 page or less to get to the bottom of message
+" otherwise go to next message
+" any message that is viewed entirely has inbox and unread tags removed
function! s:NM_show_advance_marking_read_and_archiving()
- echo 'not implemented'
+ let advance_tags = ['unread', 'inbox']
+
+ let vis_top = line('w0')
+ let vis_bot = line('w$')
+
+ let msg_top = <SID>NM_show_get_message_for_line(vis_top)
+ if !has_key(msg_top,'id')
+ echo "No top visible message."
+ endif
+
+ " if the top message is the last message, just expunge the entire thread and move on
+ if msg_top['end'] == line('$')
+ let ids = []
+ for msg in b:nm_raw_info['msgs']
+ if has_key(msg,'match') && msg['match'] != '0'
+ if len(ids)
+ call add(ids, 'OR')
+ endif
+ call add(ids, msg['id'])
+ endif
+ endfor
+
+ let filter = ['('] + advance_tags + [')', 'AND', '('] + ids + [')']
+ call <SID>NM_add_remove_tags(filter, '-', advance_tags)
+ call <SID>NM_show_next(1, 1)
+ return
+ endif
+
+ let msg_bot = <SID>NM_show_get_message_for_line(vis_bot)
+ if !has_key(msg_bot,'id')
+ echo "No bottom visible message."
+ endif
+
+ " if entire message fits on the screen, read/archive it, move to the next one
+ if msg_top['id'] != msg_bot['id'] || msg_top['end'] <= vis_bot
+ call <SID>NM_add_remove_tags_on_screen(msg_top['start'], '-', advance_tags)
+ exec printf('norm %dG', vis_top)
+ call <SID>NM_show_next(0, 1)
+ if has_key(msg_top,'match') && msg_top['match'] != '0'
+ redraw
+ " do this last to hide the latency
+ let filter = ['('] + advance_tags + [')', 'AND', msg_top['id']]
+ call <SID>NM_add_remove_tags(filter, '-', advance_tags)
+ endif
+ return
+ endif
+
+ " entire message does not fit on the screen, scroll down to bottom, max 1/2 screen
+ let jmp = winheight(winnr()) / 2
+ let max = msg_bot['end'] - vis_bot
+ if jmp > max
+ let jmp = max
+ endif
+ exec printf('norm %dGzt', vis_top + jmp)
+ return
endfunction
function! s:NM_show_pipe_message()
function! s:NM_newBuffer(type, content)
enew
- setlocal buftype=nofile readonly modifiable
+ setlocal buftype=nofile readonly modifiable scrolloff=0 sidescrolloff=0
silent put=a:content
keepjumps 0d
setlocal nomodifiable
return '''' . word . ''''
endfunction
+" this function was taken from git.vim, then fixed up
+" http://github.com/motemen/git-vim
+function! s:NM_shell_split(cmd)
+ let l:split_cmd = []
+ let cmd = a:cmd
+ let iStart = 0
+ while 1
+ let t = match(cmd, '\S', iStart)
+ if t < iStart
+ break
+ endif
+ let iStart = t
+
+ let iSpace = match(cmd, '\v(\s|$)', iStart)
+ if iSpace < iStart
+ break
+ endif
+
+ let iQuote1 = match(cmd, '\(^["'']\|[^\\]\@<=["'']\)', iStart)
+ if iQuote1 > iSpace || iQuote1 < iStart
+ let iEnd = iSpace - 1
+ let l:split_cmd += [ cmd[iStart : iEnd] ]
+ else
+ let q = cmd[iQuote1]
+ let iQuote2 = match(cmd, '[^\\]\@<=[' . q . ']', iQuote1 + 1)
+ if iQuote2 < iQuote1
+ throw 'No matching ' . q . ' quote'
+ endif
+ let iEnd = iQuote2
+ let l:split_cmd += [ cmd[iStart+1 : iEnd-1 ] ]
+ endif
+
+
+ let iStart = iEnd + 1
+ endwhile
+
+ return l:split_cmd
+endfunction
+
+
function! s:NM_run(args)
let words = a:args
call map(words, 's:NM_shell_escape(v:val)')
if !len(filter)
echoe 'Eeek! I couldn''t find the thead id!'
endif
- echo 'filter = ' . string(filter) . ' ... ' . string(type(filter))
call map(a:tags, 'a:prefix . v:val')
- " TODO: handle errors
let args = ['tag']
call extend(args, a:tags)
call add(args, '--')
call extend(args, filter)
- echo 'NUM_run( ' . string(args) . ' )'
+ " TODO: handle errors
call <SID>NM_run(args)
endfunction
" --- assign keymaps {{{1
-function! s:NM_set_map(maps)
+function! s:NM_set_map(type, maps)
nmapclear
for [key, code] in items(a:maps)
- exec printf('nnoremap <buffer> %s %s', key, code)
+ exec printf('%snoremap <buffer> %s %s', a:type, key, code)
endfor
" --- this is a hack for development :)
nnoremap ,nmr :source ~/.vim/plugin/notmuch.vim<CR>:call NotMuch('')<CR>
let args = 'folders'
endif
- let words = split(args)
- if words[0] == 'folders'
+ let words = <SID>NM_shell_split(args)
+ if words[0] == 'folders' || words[0] == 'f'
let words = words[1:]
call <SID>NM_cmd_folders(words)
- elseif words[0] == 'search'
+
+ elseif words[0] == 'search' || words[0] == 's'
if len(words) > 1
let words = words[1:]
elseif exists('b:nm_search_words')