@@ -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 .querystrings
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 = [
@@ -70,9 +71,9 @@ def __init__(self, query=None, sort=None, **kwargs):
7071 def apply (self , ui ):
7172 if self .querystring or self .sort_order :
7273 sbuffer = ui .current_buffer
73- oldquery = sbuffer .querystring
74+ oldquery = sbuffer .querystrings [ - 1 ]
7475 if self .querystring not in [None , oldquery ]:
75- sbuffer .querystring = self .querystring
76+ sbuffer .querystrings [ - 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 .querystrings [ - 1 ]
9495 return await ui .apply_command (PromptCommand ('refine ' + oldquery ))
9596
9697
9798RetagPromptCommand = 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 .querystrings .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 = [
@@ -176,7 +210,7 @@ async def apply(self, ui):
176210 if threadline_widget is None :
177211 return
178212
179- testquery = searchbuffer .querystring
213+ testquery = searchbuffer .querystrings [ - 1 ]
180214 thread = threadline_widget .get_thread ()
181215 if not self .allm :
182216 testquery = "(%s) AND thread:%s" % (testquery ,
@@ -198,7 +232,7 @@ def refresh():
198232 else :
199233 threadline_widget .rebuild ()
200234 searchbuffer .result_count = searchbuffer .dbman .count_messages (
201- searchbuffer .querystring )
235+ searchbuffer .querystrings [ - 1 ] )
202236 else :
203237 searchbuffer .rebuild ()
204238
@@ -257,5 +291,5 @@ class SaveQueryCommand(GlobalSaveQueryCommand):
257291 def apply (self , ui ):
258292 searchbuffer = ui .current_buffer
259293 if not self .query :
260- self .query = searchbuffer .querystring
294+ self .query = searchbuffer .querystrings [ - 1 ]
261295 GlobalSaveQueryCommand .apply (self , ui )
0 commit comments