Skip to content

Commit 2c6f2ab

Browse files
committed
New command 'append': Append results of another (notmuch) query to search buffer
1 parent 32b885d commit 2c6f2ab

File tree

4 files changed

+66
-20
lines changed

4 files changed

+66
-20
lines changed

alot/buffers/search.py

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def __init__(self, ui, initialquery='', sort_order=None):
2222
self.dbman = ui.dbman
2323
self.ui = ui
2424
self.querystring = initialquery
25+
self.querystring_list = [initialquery]
2526
default_order = settings.get('search_threads_sort_order')
2627
self.sort_order = sort_order or default_order
2728
self.result_count = 0
@@ -39,7 +40,7 @@ def __str__(self):
3940

4041
def get_info(self):
4142
info = {}
42-
info['querystring'] = self.querystring
43+
info['querystring'] = '" + "'.join(self.querystring_list)
4344
info['result_count'] = self.result_count
4445
info['result_count_positive'] = 's' if self.result_count > 1 else ''
4546
return info
@@ -61,20 +62,27 @@ def rebuild(self, reverse=False):
6162
if exclude_tags:
6263
exclude_tags = [t for t in exclude_tags.split(';') if t]
6364

64-
try:
65-
self.result_count = self.dbman.count_messages(self.querystring)
66-
threads = self.dbman.get_threads(
67-
self.querystring, order, exclude_tags)
68-
except NotmuchError:
69-
self.ui.notify('malformed query string: %s' % self.querystring,
70-
'error')
71-
self.listbox = urwid.ListBox([])
72-
self.body = self.listbox
73-
return
74-
75-
self.threadlist = IterableWalker(threads, ThreadlineWidget,
76-
dbman=self.dbman,
77-
reverse=reverse)
65+
self.result_count = 0
66+
self.threadlist = None
67+
for query in self.querystring_list:
68+
try:
69+
self.result_count += self.dbman.count_messages(query)
70+
threads = self.dbman.get_threads(
71+
query, order, exclude_tags)
72+
except NotmuchError:
73+
self.ui.notify('malformed query string: %s' % query,
74+
'error')
75+
self.listbox = urwid.ListBox([])
76+
self.body = self.listbox
77+
return
78+
79+
iterablewalker = IterableWalker(threads, ThreadlineWidget,
80+
dbman=self.dbman,
81+
reverse=reverse)
82+
if self.threadlist:
83+
self.threadlist.append(iterablewalker)
84+
else:
85+
self.threadlist = iterablewalker
7886

7987
self.listbox = urwid.ListBox(self.threadlist)
8088
self.body = self.listbox

alot/commands/globals.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def apply(self, ui):
112112
open_searches = ui.get_buffers_of_type(buffers.SearchBuffer)
113113
to_be_focused = None
114114
for sb in open_searches:
115-
if sb.querystring == self.query:
115+
if sb.querystring_list == [self.query]:
116116
to_be_focused = sb
117117
if to_be_focused:
118118
if ui.current_buffer != to_be_focused:

alot/commands/search.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,13 @@ def apply(self, ui):
3535
if not self.thread:
3636
self.thread = ui.current_buffer.get_selected_thread()
3737
if self.thread:
38-
query = ui.current_buffer.querystring
38+
query_list = ui.current_buffer.querystring_list
3939
logging.info('open thread view for %s', self.thread)
4040

4141
tb = buffers.ThreadBuffer(ui, self.thread)
4242
ui.buffer_open(tb)
43-
tb.unfold_matching(query)
43+
for query in query_list:
44+
tb.unfold_matching(query)
4445

4546

4647
@registerCommand(MODE, 'refine', help='refine query', arguments=[
@@ -72,7 +73,7 @@ def apply(self, ui):
7273
sbuffer = ui.current_buffer
7374
oldquery = sbuffer.querystring
7475
if self.querystring not in [None, oldquery]:
75-
sbuffer.querystring = self.querystring
76+
sbuffer.querystring_list[-1] = self.querystring
7677
sbuffer = ui.current_buffer
7778
if self.sort_order:
7879
sbuffer.sort_order = self.sort_order
@@ -90,13 +91,46 @@ class RefinePromptCommand(Command):
9091

9192
async def apply(self, ui):
9293
sbuffer = ui.current_buffer
93-
oldquery = sbuffer.querystring
94+
oldquery = sbuffer.querystring_list[-1]
9495
return await ui.apply_command(PromptCommand('refine ' + oldquery))
9596

9697

9798
RetagPromptCommand = registerCommand(MODE, 'retagprompt')(RetagPromptCommand)
9899

99100

101+
@registerCommand(MODE, 'append', usage='append query', arguments=[
102+
(['--sort'], {'help': 'sort order', 'choices': [
103+
'oldest_first', 'newest_first', 'message_id', 'unsorted']}),
104+
(['query'], {'nargs': argparse.REMAINDER, 'help': 'search string'})])
105+
class AppendCommand(Command):
106+
107+
"""append the results of a new query to this buffer. Search obeys the notmuch
108+
:ref:`search.exclude_tags <search.exclude_tags>` setting."""
109+
repeatable = True
110+
111+
def __init__(self, query, sort=None, **kwargs):
112+
"""
113+
:param query: notmuch querystring
114+
:type query: str
115+
:param sort: how to order results. Must be one of
116+
'oldest_first', 'newest_first', 'message_id' or
117+
'unsorted'.
118+
:type sort: str
119+
"""
120+
self.query = ' '.join(query)
121+
self.order = sort
122+
Command.__init__(self, **kwargs)
123+
124+
def apply(self, ui):
125+
if self.query:
126+
sbuffer = ui.current_buffer
127+
sbuffer.querystring_list.append(self.query)
128+
sbuffer.rebuild()
129+
ui.update()
130+
else:
131+
ui.notify('empty query string')
132+
133+
100134
@registerCommand(
101135
MODE, 'tag', forced={'action': 'add'},
102136
arguments=[

alot/walker.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Copyright © 2018 Dylan Baker
33
# This file is released under the GNU GPL, version 3 or a later revision.
44
# For further details see the COPYING file
5+
import itertools
56
import logging
67
import urwid
78

@@ -92,3 +93,6 @@ def _get_next_item(self):
9293

9394
def get_lines(self):
9495
return self.lines
96+
97+
def append(self, iterableWalker):
98+
self.iterable = itertools.chain(self.iterable, iterableWalker.iterable)

0 commit comments

Comments
 (0)