mirror of
https://git.notmuchmail.org/git/notmuch
synced 2025-01-03 07:11:41 +01:00
vim: add a helper to combine tag search expressions
This commit is contained in:
parent
5030989ee0
commit
efa9df2d49
1 changed files with 33 additions and 20 deletions
|
@ -269,7 +269,7 @@ function! s:NM_search_show_thread()
|
||||||
if id != ''
|
if id != ''
|
||||||
let words = [id]
|
let words = [id]
|
||||||
if exists('b:nm_search_words')
|
if exists('b:nm_search_words')
|
||||||
let words = ['('] + b:nm_search_words + [')', 'and', id]
|
let words = ['('] + b:nm_search_words + [')', 'AND', id]
|
||||||
endif
|
endif
|
||||||
if len(words)
|
if len(words)
|
||||||
call <SID>NM_cmd_show(words)
|
call <SID>NM_cmd_show(words)
|
||||||
|
@ -323,23 +323,13 @@ endfunction
|
||||||
|
|
||||||
function! s:NM_search_filter_helper(prompt, prefix, joiner)
|
function! s:NM_search_filter_helper(prompt, prefix, joiner)
|
||||||
" TODO: input() can support completion
|
" TODO: input() can support completion
|
||||||
let text = input(a:prompt)
|
let text = substitute(input(a:prompt), '\v(^\s*|\s*$|\n)', '', 'g')
|
||||||
if !strlen(text)
|
if !strlen(text)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let tags = split(text)
|
let tags = b:nm_search_words + ['AND']
|
||||||
if strlen(a:prefix)
|
\ + <SID>NM_combine_tags(a:prefix, split(text), a:joiner, '()')
|
||||||
call map(tags, 'a:prefix . v:val')
|
|
||||||
endif
|
|
||||||
if strlen(a:joiner)
|
|
||||||
let idx = len(tags) - 1
|
|
||||||
while idx > 0
|
|
||||||
call insert(tags, a:joiner, idx)
|
|
||||||
let idx = idx - 1
|
|
||||||
endwhile
|
|
||||||
endif
|
|
||||||
let tags = b:nm_search_words + ['and', '('] + tags + [')']
|
|
||||||
|
|
||||||
let prev_bufnr = bufnr('%')
|
let prev_bufnr = bufnr('%')
|
||||||
setlocal bufhidden=hide
|
setlocal bufhidden=hide
|
||||||
|
@ -546,14 +536,12 @@ function! s:NM_show_advance_marking_read_and_archiving()
|
||||||
let ids = []
|
let ids = []
|
||||||
for msg in b:nm_raw_info['msgs']
|
for msg in b:nm_raw_info['msgs']
|
||||||
if has_key(msg,'match') && msg['match'] != '0'
|
if has_key(msg,'match') && msg['match'] != '0'
|
||||||
if len(ids)
|
|
||||||
call add(ids, 'OR')
|
|
||||||
endif
|
|
||||||
call add(ids, msg['id'])
|
call add(ids, msg['id'])
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
|
let filter = <SID>NM_combine_tags('tag:', advance_tags, 'OR', '()')
|
||||||
let filter = ['('] + advance_tags + [')', 'AND', '('] + ids + [')']
|
\ + ['AND']
|
||||||
|
\ + <SID>NM_combine_tags('', ids, 'OR', '()')
|
||||||
call <SID>NM_add_remove_tags(filter, '-', advance_tags)
|
call <SID>NM_add_remove_tags(filter, '-', advance_tags)
|
||||||
call <SID>NM_show_next(1, 1)
|
call <SID>NM_show_next(1, 1)
|
||||||
return
|
return
|
||||||
|
@ -572,7 +560,8 @@ function! s:NM_show_advance_marking_read_and_archiving()
|
||||||
if has_key(msg_top,'match') && msg_top['match'] != '0'
|
if has_key(msg_top,'match') && msg_top['match'] != '0'
|
||||||
redraw
|
redraw
|
||||||
" do this last to hide the latency
|
" do this last to hide the latency
|
||||||
let filter = ['('] + advance_tags + [')', 'AND', msg_top['id']]
|
let filter = <SID>NM_combine_tags('tag:', advance_tags, 'OR', '()')
|
||||||
|
\ + ['AND', msg_top['id']]
|
||||||
call <SID>NM_add_remove_tags(filter, '-', advance_tags)
|
call <SID>NM_add_remove_tags(filter, '-', advance_tags)
|
||||||
endif
|
endif
|
||||||
return
|
return
|
||||||
|
@ -1218,6 +1207,30 @@ function! s:NM_new_mail()
|
||||||
echo 'not implemented'
|
echo 'not implemented'
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
" --- tag manipulation helpers {{{1
|
||||||
|
|
||||||
|
" used to combine an array of words with prefixes and separators
|
||||||
|
" example:
|
||||||
|
" NM_combine_tags('tag:', ['one', 'two', 'three'], 'OR', '()')
|
||||||
|
" -> ['(', 'tag:one', 'OR', 'tag:two', 'OR', 'tag:three', ')']
|
||||||
|
function s:NM_combine_tags(word_prefix, words, separator, brackets)
|
||||||
|
let res = []
|
||||||
|
for word in a:words
|
||||||
|
if len(res) && strlen(a:separator)
|
||||||
|
call add(res, a:separator)
|
||||||
|
endif
|
||||||
|
call add(res, a:word_prefix . word)
|
||||||
|
endfor
|
||||||
|
if len(res) > 1 && strlen(a:brackets)
|
||||||
|
if strlen(a:brackets) != 2
|
||||||
|
throw 'Eeek! brackets arg to NM_combine_tags must be 2 chars'
|
||||||
|
endif
|
||||||
|
call insert(res, a:brackets[0])
|
||||||
|
call add(res, a:brackets[1])
|
||||||
|
endif
|
||||||
|
return res
|
||||||
|
endfunction
|
||||||
|
|
||||||
" --- other helpers {{{1
|
" --- other helpers {{{1
|
||||||
|
|
||||||
function! s:NM_get_search_words()
|
function! s:NM_get_search_words()
|
||||||
|
|
Loading…
Reference in a new issue