X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fplugin%2Fnotmuch.vim;h=8e3a92abcfd82e9bef2310fc8552a5603aede88a;hp=c8a27ad7cc2c310a38a8961e1bcfb6ad924769d2;hb=5bb149aab27b68d48b165f1e0dae19d1a83cc6f2;hpb=8c8dacb26a08acc91cee723276851feb369743d0 diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index c8a27ad7..8e3a92ab 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -161,7 +161,7 @@ function! s:NM_cmd_folders(words) let b:nm_timestamp = reltime() call NM_cmd_folders_mksyntax() - call NM_set_map(g:notmuch_folders_maps) + call NM_set_map('n', g:notmuch_folders_maps) setlocal cursorline setlocal nowrap endfunction @@ -209,7 +209,7 @@ function! s:NM_cmd_search(words) let b:nm_search_words = a:words call NM_cmd_search_mksyntax() - call NM_set_map(g:notmuch_search_maps) + call NM_set_map('n', g:notmuch_search_maps) setlocal cursorline setlocal nowrap endfunction @@ -254,7 +254,7 @@ function! s:NM_search_prompt() 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 @@ -351,12 +351,15 @@ function! s:NM_search_thread_id() 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) @@ -392,7 +395,7 @@ function! s:NM_cmd_show(words) call NM_cmd_show_mkfolds() call NM_cmd_show_mksyntax() - call NM_set_map(g:notmuch_show_maps) + call NM_set_map('n', g:notmuch_show_maps) setlocal foldtext=NM_cmd_show_foldtext() setlocal fillchars= setlocal foldcolumn=6 @@ -521,7 +524,6 @@ function! s:NM_show_advance_marking_read_and_archiving() endfor let filter = ['('] + advance_tags + [')', 'AND', '('] + ids + [')'] -echo 'NM_add_remove_tags ALL filter=' . string(filter) call NM_add_remove_tags(filter, '-', advance_tags) call NM_show_next(1, 1) return @@ -532,8 +534,6 @@ echo 'NM_add_remove_tags ALL filter=' . string(filter) echo "No bottom visible message." endif - echo 'top=' . msg_top['id'] . ' bot=' . msg_top['id'] - " 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 NM_add_remove_tags_on_screen(msg_top['start'], '-', advance_tags) @@ -543,7 +543,6 @@ echo 'NM_add_remove_tags ALL filter=' . string(filter) redraw " do this last to hide the latency let filter = ['('] + advance_tags + [')', 'AND', msg_top['id']] -echo 'NM_add_remove_tags 1 filter=' . string(filter) call NM_add_remove_tags(filter, '-', advance_tags) endif return @@ -848,12 +847,10 @@ endfunction 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 - set scrolloff=0 - set sidescrolloff=0 execute printf('set filetype=notmuch-%s', a:type) execute printf('set syntax=notmuch-%s', a:type) let b:nm_type = a:type @@ -864,6 +861,46 @@ function! s:NM_shell_escape(word) 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)') @@ -919,14 +956,12 @@ function! s:NM_add_remove_tags(filter, prefix, tags) 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 NM_run(args) endfunction @@ -982,10 +1017,10 @@ endif " --- 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 %s %s', key, code) + exec printf('%snoremap %s %s', a:type, key, code) endfor " --- this is a hack for development :) nnoremap ,nmr :source ~/.vim/plugin/notmuch.vim:call NotMuch('') @@ -999,11 +1034,12 @@ function! NotMuch(args) let args = 'folders' endif - let words = split(args) - if words[0] == 'folders' + let words = NM_shell_split(args) + if words[0] == 'folders' || words[0] == 'f' let words = words[1:] call 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')