Re: [PATCH v2] emacs: insert quotable parts in reply as they are displayed in show...
[notmuch-archives.git] / a1 / 12eede70ca81bb106f2065069deb91de00547a
1 Return-Path: <racin@free.fr>\r
2 X-Original-To: notmuch@notmuchmail.org\r
3 Delivered-To: notmuch@notmuchmail.org\r
4 Received: from localhost (localhost [127.0.0.1])\r
5         by olra.theworths.org (Postfix) with ESMTP id 6A6F3431FAE\r
6         for <notmuch@notmuchmail.org>; Thu, 25 Feb 2010 07:52:18 -0800 (PST)\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
8 X-Spam-Flag: NO\r
9 X-Spam-Score: -1.787\r
10 X-Spam-Level: \r
11 X-Spam-Status: No, score=-1.787 tagged_above=-999 required=5 tests=[AWL=0.812,\r
12         BAYES_00=-2.599] autolearn=unavailable\r
13 Received: from olra.theworths.org ([127.0.0.1])\r
14         by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
15         with ESMTP id vYZiTuO94b5f for <notmuch@notmuchmail.org>;\r
16         Thu, 25 Feb 2010 07:52:15 -0800 (PST)\r
17 Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5])\r
18         by olra.theworths.org (Postfix) with ESMTP id A63D8431FBC\r
19         for <notmuch@notmuchmail.org>; Thu, 25 Feb 2010 07:52:13 -0800 (PST)\r
20 Received: from smtp5-g21.free.fr (localhost [127.0.0.1])\r
21         by smtp5-g21.free.fr (Postfix) with ESMTP id 928A5D480BF;\r
22         Thu, 25 Feb 2010 16:52:02 +0100 (CET)\r
23 Received: from zimbra1-e1.priv.proxad.net (zimbra1-e1.priv.proxad.net\r
24         [172.20.243.151])\r
25         by smtp5-g21.free.fr (Postfix) with ESMTP id E61D6D4808C;\r
26         Thu, 25 Feb 2010 16:51:59 +0100 (CET)\r
27 Date: Thu, 25 Feb 2010 16:51:59 +0100 (CET)\r
28 From: racin@free.fr\r
29 To: Carl Worth <cworth@cworth.org>\r
30 Message-ID:\r
31  <1857273639.5354781267113119409.JavaMail.root@zimbra1-e1.priv.proxad.net>\r
32 In-Reply-To:\r
33  <829811857.5353531267112884804.JavaMail.root@zimbra1-e1.priv.proxad.net>\r
34 MIME-Version: 1.0\r
35 Content-Type: text/plain; charset=utf-8\r
36 Content-Transfer-Encoding: quoted-printable\r
37 X-Originating-IP: [132.166.135.72]\r
38 X-Mailer: Zimbra 5.0 (ZimbraWebClient - FF3.0\r
39         (Linux)/5.0.15_GA_2815.UBUNTU8_64)\r
40 X-Authenticated-User: racin@free.fr\r
41 Cc: notmuch@notmuchmail.org\r
42 Subject: Re: [notmuch] [PATCH] Support for deletion (patch included)\r
43 X-BeenThere: notmuch@notmuchmail.org\r
44 X-Mailman-Version: 2.1.13\r
45 Precedence: list\r
46 List-Id: "Use and development of the notmuch mail system."\r
47         <notmuch.notmuchmail.org>\r
48 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
49         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
50 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
51 List-Post: <mailto:notmuch@notmuchmail.org>\r
52 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
53 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
54         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
55 X-List-Received-Date: Thu, 25 Feb 2010 15:52:18 -0000\r
56 \r
57 Carl: The patch in the mail has problems; apparently I have to manually add=\r
58  scissorlines to the mail for it\r
59 to be processed by git-am. I thought this was automatically added. (I hate =\r
60 the git UI -- nothing is consistent,\r
61 concepts have different names, the definition of scissor lines is as precis=\r
62 e as "A line that mainly consists of scissors (either ">8" or "8<") and per=\r
63 foration (dash "-") --, but I guess we can get used to it after a while...)\r
64 \r
65 I'll send you a proper patch as soon as I can. Meanwhile, I'm sure you have=\r
66  comments on this updated patch!\r
67 \r
68 Matthieu\r
69 \r
70 =C3=80: "Carl Worth" <cworth@cworth.org>\r
71 Cc: notmuch@notmuchmail.org\r
72 Envoy=C3=A9: Jeudi 25 F=C3=A9vrier 2010 00h00:04 GMT +00:00 GMT - Grande-Br=\r
73 etagne, Irlande, Portugal\r
74 Objet: Re: [notmuch] [PATCH] Support for deletion (patch included)\r
75 \r
76 Hi Carl,\r
77 \r
78 > Could you also write a commit message describing what the patch does?\r
79 > The easiest way for me to apply that would be if you would create a git\r
80 > commit, then run "git format-patch origin/master" and mail the resulting\r
81 > files, (the "git send-email" command can be used here, or you can insert\r
82 > the files into a mail-composition buffer and modify them as needed).\r
83 >=20\r
84 \r
85 OK, here it is (comments below). I had trouble splitting the patches into a=\r
86  patch series; I\r
87 found git add -p, but isn't there a better interface for selecting patches?\r
88 \r
89 >From bdee9558d93bffb97c80632f522288e059deb7c2 Mon Sep 17 00:00:00 2001\r
90 From: Matthieu Lemerre <racin@racin.rez-gif.supelec.fr>\r
91 Date: Thu, 25 Feb 2010 00:24:24 +0100\r
92 Subject: [PATCH 1/2] Add and use notmuch-show-forall-in-thread macro\r
93 \r
94 ---\r
95  notmuch.el |   17 +++++++++++------\r
96  1 files changed, 11 insertions(+), 6 deletions(-)\r
97 \r
98 diff --git a/notmuch.el b/notmuch.el\r
99 index 6482170..5d7342a 100644\r
100 --- a/notmuch.el\r
101 +++ b/notmuch.el\r
102 @@ -321,17 +321,22 @@ pseudoheader summary"\r
103  =09=09=09 (cons (notmuch-show-get-message-id) nil)))\r
104  =09  (notmuch-show-set-tags (sort (set-difference tags toremove :test 'str=\r
105 ing=3D) 'string<))))))\r
106 =20\r
107 -(defun notmuch-show-archive-thread-maybe-mark-read (markread)\r
108 -  (save-excursion\r
109 +(defmacro notmuch-show-forall-in-thread (&rest body)\r
110 +  "Executes BODY with point in all messages of the current thread."\r
111 +  `(save-excursion\r
112      (goto-char (point-min))\r
113      (while (not (eobp))\r
114 -      (if markread\r
115 -=09  (notmuch-show-remove-tag "unread" "inbox")\r
116 -=09(notmuch-show-remove-tag "inbox"))\r
117 +      ,@body\r
118        (if (not (eobp))\r
119  =09  (forward-char))\r
120        (if (not (re-search-forward notmuch-show-message-begin-regexp nil t)=\r
121 )\r
122 -=09  (goto-char (point-max)))))\r
123 +=09  (goto-char (point-max))))))\r
124 +\r
125 +(defun notmuch-show-archive-thread-maybe-mark-read (markread)\r
126 +  (notmuch-show-forall-in-thread\r
127 +      (if markread\r
128 +=09  (notmuch-show-remove-tag "unread" "inbox")\r
129 +=09(notmuch-show-remove-tag "inbox")))\r
130    (let ((parent-buffer notmuch-show-parent-buffer))\r
131      (kill-this-buffer)\r
132      (if parent-buffer\r
133 --=20\r
134 1.6.5\r
135 \r
136 \r
137 This first patch is helpful for factorizing out code. Basically, it allows =\r
138 to\r
139 apply a "message-only" command to all the thread.\r
140 \r
141 >From 0073152e3fa7dd11d88de28e87eec7762cdbbbeb Mon Sep 17 00:00:00 2001\r
142 From: Matthieu Lemerre <racin@racin.rez-gif.supelec.fr>\r
143 Date: Thu, 25 Feb 2010 00:25:51 +0100\r
144 Subject: [PATCH 2/2] Add support for deletion in the emacs interface\r
145 \r
146 ---\r
147  notmuch.el |   56 +++++++++++++++++++++++++++++++++++++++++++++++++-------\r
148  1 files changed, 49 insertions(+), 7 deletions(-)\r
149 \r
150 diff --git a/notmuch.el b/notmuch.el\r
151 index 5d7342a..0285573 100644\r
152 --- a/notmuch.el\r
153 +++ b/notmuch.el\r
154 @@ -92,6 +92,8 @@\r
155      (define-key map "x" 'notmuch-show-archive-thread-then-exit)\r
156      (define-key map "A" 'notmuch-show-mark-read-then-archive-thread)\r
157      (define-key map "a" 'notmuch-show-archive-thread)\r
158 +    (define-key map "d" 'notmuch-show-delete-thread)\r
159 +    (define-key map "D" 'notmuch-show-delete-message)\r
160      (define-key map "p" 'notmuch-show-previous-message)\r
161      (define-key map "N" 'notmuch-show-mark-read-then-next-open-message)\r
162      (define-key map "n" 'notmuch-show-next-message)\r
163 @@ -380,6 +382,23 @@ buffer."\r
164    (notmuch-show-archive-thread)\r
165    (kill-this-buffer))\r
166 =20\r
167 +(defun notmuch-show-delete-message ()\r
168 +  "Delete current message (sets its deleted tag)."\r
169 +  (interactive)\r
170 +  (notmuch-show-add-tag "deleted"))\r
171 +\r
172 +(defun notmuch-show-delete-thread()\r
173 +  "Delete each message in thread."\r
174 +  (interactive)\r
175 +  (notmuch-show-forall-in-thread\r
176 +   (notmuch-show-delete-message)))\r
177 +\r
178 +(defun notmuch-show-delete-thread-and-exit()\r
179 +  "Delete each message in thread, then exit back to search results."\r
180 +  (interactive)\r
181 +  (notmuch-show-delete-thread)\r
182 +  (kill-this-buffer))\r
183 +\r
184  (defun notmuch-show-mark-read-then-archive-then-exit ()\r
185    "Remove unread tags from thread, then archive and exit to search results=\r
186 ."\r
187    (interactive)\r
188 @@ -1227,6 +1246,7 @@ matching this search term are shown if non-nil. "\r
189      (define-key map [mouse-1] 'notmuch-search-show-thread)\r
190      (define-key map "*" 'notmuch-search-operate-all)\r
191      (define-key map "a" 'notmuch-search-archive-thread)\r
192 +    (define-key map "d" 'notmuch-search-delete-thread)\r
193      (define-key map "-" 'notmuch-search-remove-tag)\r
194      (define-key map "+" 'notmuch-search-add-tag)\r
195      (define-key map (kbd "RET") 'notmuch-search-show-thread)\r
196 @@ -1235,6 +1255,7 @@ matching this search term are shown if non-nil. "\r
197  (fset 'notmuch-search-mode-map notmuch-search-mode-map)\r
198 =20\r
199  (defvar notmuch-search-query-string)\r
200 +(defvar notmuch-search-history nil)\r
201  (defvar notmuch-search-oldest-first t\r
202    "Show the oldest mail first in the search-mode")\r
203 =20\r
204 @@ -1446,6 +1467,13 @@ This function advances the next thread when finished=\r
205 ."\r
206    (notmuch-search-remove-tag "inbox")\r
207    (forward-line))\r
208 =20\r
209 +(defun notmuch-search-delete-thread ()\r
210 +  "Mark the currently selected thread as deleted (set its \"deleted\" tag)=\r
211 .\r
212 +This function advances the next thread when finished."\r
213 +  (interactive)\r
214 +  (notmuch-search-add-tag "deleted")\r
215 +  (forward-line))\r
216 +\r
217  (defun notmuch-search-process-sentinel (proc msg)\r
218    "Add a message to let user know when \"notmuch search\" exits"\r
219    (let ((buffer (process-buffer proc))\r
220 @@ -1520,10 +1548,22 @@ characters as well as `_.+-'.\r
221  =09   (append action-split (list notmuch-search-query-string) nil))))\r
222 =20\r
223  ;;;###autoload\r
224 -(defun notmuch-search (query &optional oldest-first)\r
225 -  "Run \"notmuch search\" with the given query string and display results.=\r
226 "\r
227 -  (interactive "sNotmuch search: ")\r
228 -  (let ((buffer (get-buffer-create (concat "*notmuch-search-" query "*")))=\r
229 )\r
230 +(defun notmuch-search (query &optional oldest-first include-deleted)\r
231 +  "Run \"notmuch search\" with the given query string and display results.\r
232 +\r
233 +With prefix argument, include deleted items.\r
234 +"\r
235 +  (interactive (let* ((prefix current-prefix-arg)\r
236 +=09=09      (query (if prefix\r
237 +=09=09=09=09 (read-string "Notmuch search (including deleted): "\r
238 +=09=09=09=09=09      notmuch-search-query-string\r
239 +=09=09=09=09=09      'notmuch-search-history)\r
240 +=09=09=09       (read-string "Notmuch search: " nil\r
241 +=09=09=09=09=09    'notmuch-search-history))))\r
242 +=09=09 (list query nil prefix)))\r
243 +  (let ((real-query (if include-deleted query=20\r
244 +=09=09      (concat "not tag:deleted and (" query ")")))\r
245 +=09(buffer (get-buffer-create (concat "*notmuch-search-" query "*"))))\r
246      (switch-to-buffer buffer)\r
247      (notmuch-search-mode)\r
248      (set 'notmuch-search-query-string query)\r
249 @@ -1539,7 +1579,7 @@ characters as well as `_.+-'.\r
250  =09(let ((proc (start-process-shell-command\r
251  =09=09     "notmuch-search" buffer notmuch-command "search"\r
252  =09=09     (if oldest-first "--sort=3Doldest-first" "--sort=3Dnewest-first=\r
253 ")\r
254 -=09=09     (shell-quote-argument query))))\r
255 +=09=09     (shell-quote-argument real-query))))\r
256  =09  (set-process-sentinel proc 'notmuch-search-process-sentinel)\r
257  =09  (set-process-filter proc 'notmuch-search-process-filter))))\r
258      (run-hooks 'notmuch-search-hook)))\r
259 @@ -1587,7 +1627,7 @@ search."\r
260 =20\r
261  Runs a new search matching only messages that match both the\r
262  current search results AND the additional query string provided."\r
263 -  (interactive "sFilter search: ")\r
264 +  (interactive "sFilter search:")\r
265    (let ((grouped-query (if (string-match-p notmuch-search-disjunctive-rege=\r
266 xp query) (concat "( " query " )") query)))\r
267      (notmuch-search (concat notmuch-search-query-string " and " grouped-qu=\r
268 ery) notmuch-search-oldest-first)))\r
269 =20\r
270 @@ -1630,7 +1670,9 @@ current search results AND that are tagged with the g=\r
271 iven tag."\r
272 =20\r
273  (fset 'notmuch-folder-mode-map notmuch-folder-mode-map)\r
274 =20\r
275 -(defcustom notmuch-folders (quote (("inbox" . "tag:inbox") ("unread" . "ta=\r
276 g:unread")))\r
277 +(defcustom notmuch-folders (quote (("inbox" . "tag:inbox")=20\r
278 +=09=09=09=09   ("unread" . "tag:unread")\r
279 +=09=09=09=09   ("deleted" . "tag:deleted")))\r
280    "List of searches for the notmuch folder view"\r
281    :type '(alist :key-type (string) :value-type (string))\r
282    :group 'notmuch)\r
283 --=20\r
284 1.6.5\r
285 \r
286 \r
287 This second patch is the reworked patch, after your comments.\r
288 \r
289 > A couple of minor comments on the patch:\r
290 >=20\r
291 > >      (define-key map "a" 'notmuch-search-archive-thread)\r
292 > > +    (define-key map "d" 'notmuch-search-mark-as-deleted)\r
293 >=20\r
294 > For consistency, let's name this notmuch-search-delete-thread.\r
295 >=20\r
296 > And we'll probably want a notmuch-show-delete-message function as well,\r
297 > no?\r
298 \r
299 Did both. I have however a question: how to handle in the UI the\r
300 thread/message distinction? For now, I set "d" in notmuch-show buffer\r
301 to act as "delete the current thread", and "D" as "delete the current\r
302 message". I thought that as "d" meant in notmuch summary "delete the\r
303 current thread", the bindings would be more consistent.  But now I\r
304 wonder if this may be counter intuitive, and if we should use "d" for\r
305 "delete current message" and "D" for "delete current thread". What do\r
306 people think?\r
307 \r
308 It would be nice to have, in general a convenient way to handle the\r
309 thread/message distinction in the UI (e.g. for applying other tags).\r
310 \r
311 >=20\r
312 > > +(defvar notmuch-search-history nil)\r
313 >=20\r
314 > Excellent! I've wanted custom search history for a while, and just\r
315 > didn't know how to do it with (interactive "s"). It looks easy enough\r
316 > with read-string as you're doing here. But this is independent\r
317 > functionality, so would be preferred as an independent patch/commit.\r
318 \r
319 In fact I needed this; that way when you do "C-u s", the previous\r
320 search is shown, and to include deleted items you just have to do "C-u\r
321 s RET".  So I made them in a single commit; but I can split them if\r
322 you really want to.\r
323 \r
324 >=20\r
325 > >    (forward-line))\r
326 > > =20\r
327 > > +\r
328 > > +(defun notmuch-search-mark-as-deleted ()\r
329 > > +  "Mark the currently selected thread as deleted (set its \"deleted\" =\r
330 tag).\r
331 > > +This function advances the next thread when finished."\r
332 > > +  (interactive)\r
333 > > +  (notmuch-search-add-tag "deleted")\r
334 > > +  (forward-line))\r
335 > > +\r
336 > > +\r
337 > >  (defun notmuch-search-process-sentinel (proc msg)\r
338 >=20\r
339 > Watch that extra whitespace. The convention is a single line of\r
340 > whitespace between each function.\r
341 >=20\r
342 \r
343 My bad. I did not see this in my review. Corrected this in the updated patc=\r
344 h.\r
345 \r
346 > And should we also archive the thread before removing the deleted tag?\r
347 \r
348 I don't understand this. Do you mean: should we also archive the\r
349 thread before setting the deleted tag? I don't known why we should\r
350 bother to do it, as the tag is not show by the next results.=20\r
351 \r
352 I would tend to think that archiving should be an explicit action,\r
353 that should call a hook. For instance, I'd like my mailflow to be like\r
354 this:\r
355 \r
356 - get mail with offlineimap =3D> a maildir directory, indexed by notmuch\r
357 \r
358 - mails stay in inbox until I archive it. That way I can still access\r
359   it with IMAP.\r
360 \r
361 - archiving puts an "archived" tag (and removes the inbox and unread\r
362   tags), and move the mail to another directory (or uses git to\r
363   archive the mail).\r
364 \r
365 - deleting puts a deleted tag (but the messages stays inbox as long as\r
366   I do not explicitely remove this).\r
367 \r
368 The main reason is that many mail servers only allow small quotas, so\r
369 you have to carefully select which mail should stay inbox (only the\r
370 mail that you need external access).\r
371 \r
372 In brief, this mail flow needs to delete threads but not to archive\r
373 it. I think that we could provide hooks, so that you can archive\r
374 mails when you delete them if you like to.\r
375 \r
376 By the way in my patch commentary, you said that you planned to change\r
377 the "inbox" and "unread" treatments to be more explicit. Do you still\r
378 plan to do that? I can maybe also provide a patch.\r
379 \r
380 > > +With prefix argument, include deleted items.\r
381 >=20\r
382 > That's a pretty good interface I think.\r
383 >=20\r
384 > Another approach would be to do something like what sup does---that\r
385 > would be to scan the search terms and if it contains "tag:deleted" and\r
386 > all then don't prepend the "not tag:deleted and" to the search\r
387 > string. The assumption there is that if the user is explicitly\r
388 > mentioning the deleted tag, then we should just rely on the user to\r
389 > explicitly describe how the tag should be treated.\r
390 >=20\r
391 > That's perhaps not an unreasonable heuristic, and might be done even in\r
392 > addition to the prefix-argument approach. But that could be an\r
393 > additional commit, and I won't require it.\r
394 \r
395 Hmm, that's what I did want to do initially. In that case, I think\r
396 that notmuch should be able to output parse trees from notmuch search\r
397 strings as JSON; this would help do the parsing in the various\r
398 implementations.\r
399 \r
400 I also had this idea that may solve the "tag should be\r
401 orthogonal/command-line UI problem". We observe that "archived" is\r
402 contrary to "inbox", "read" contrary to "unread", "deleted" contrary\r
403 to "undeleted", and so on.\r
404 \r
405 So it may be a good idea to have "pseudo-tags", that would help in the\r
406 interface (searching archived mails with search not tag:inbox is not\r
407 very intuitive...), as synonyms for "not tag:countrary-tag"\r
408 \r
409 Then for each "pseudo-tag", notmuch could hard-code which is included\r
410 by default. Adding the other tags is easy: just add "and tag:deleted"\r
411 or "and tag:read" or "and tag:archived". Moreover, this would simplify\r
412 UI implementation as well, without requiring parsing of the strings.\r
413 \r
414 Another, even simpler possibility would be to add a "--all" flag to\r
415 notmuch. Without it, it would omit some of the tags (like the deleted\r
416 ones), which would be convenient as a text interface. With it, it\r
417 would show all tags, which would be convenient for use with scripts\r
418 and UI, and mor in the "tags are orthogonal" spirit. Again, this would\r
419 not require to parse search strings, and imho would be much cleaner.\r
420 \r
421 > > +  (interactive (let* ((prefix current-prefix-arg)\r
422 > > +                      (query (if prefix\r
423 > > +                                 (read-string "Notmuch search (includi=\r
424 ng deleted): "\r
425 > > +                                              notmuch-search-query-str=\r
426 ing\r
427 > > +                                              'notmuch-search-history)\r
428 > > +                               (read-string "Notmuch search: " nil\r
429 > > +                                            'notmuch-search-history)))=\r
430 )\r
431 >=20\r
432 > Why is the second (initial-input) argument non-nil in one case, but nil\r
433 > in the other? The documentation for `read-string' says the argument is\r
434 > deprecated and should be nil in all new code.\r
435 \r
436 The idea is that you do not have default search terms if you do\r
437 regular searchs. But if you want to include deleted items, then you\r
438 have the last search string. This way, you handle the common case when\r
439 you serach for a term, do not find it, then decide to try again with\r
440 deleted items.\r
441 \r
442 Now, maybe the C-u interface is not such a good idea, and a toggle\r
443 button would be better. Don't know, but I find this interface\r
444 convenient.\r
445 \r
446 >=20\r
447 > > +                 (list query nil prefix)))\r
448 > > +  (let ((real-query (if include-deleted query\r
449 > > +                      (concat "not tag:deleted and (" query ")")))\r
450 > > +        (buffer (get-buffer-create (concat "*notmuch-search-" query\r
451 > > "*"))))\r
452 >=20\r
453 > Does the include-deleted case actually work? I don't see anything in the\r
454 > code that sets this variable. (I'm just reviewing here--I haven't tested\r
455 > it manually).\r
456 \r
457 This is the way interactive work.\r
458 (defun notmuch-search (query &optional oldest-first include-deleted)\r
459 ...\r
460 +  (interactive (let* ((prefix current-prefix-arg)\r
461 ...\r
462 +=09=09 (list query nil prefix)))\r
463 \r
464 The (list query nil prefix) at the end of the (interactive) form will\r
465 set query to query, nil to oldest-first, and prefix to\r
466 include-deleted.\r
467 \r
468 >=20\r
469 > > @@ -1351,7 +1374,6 @@ search."\r
470 > > =20\r
471 > >  Runs a new search matching only messages that match both the\r
472 > >  current search results AND the additional query string provided."\r
473 > > -  (interactive "sFilter search: ")\r
474 > >    (let ((grouped-query (if (string-match-p notmuch-search-disjunctive-=\r
475 regexp query) (concat "( " query " )") query)))\r
476 > >      (notmuch-search (concat notmuch-search-query-string " and " groupe=\r
477 d-query) notmuch-search-oldest-first)))\r
478 >=20\r
479 > Is this just an accidental chunk in the patch? I don't see why this\r
480 > function should become non-interactive now.\r
481 \r
482 My bad, corrected that also.\r
483 \r
484 Matthieu\r
485 _______________________________________________\r
486 notmuch mailing list\r
487 notmuch@notmuchmail.org\r
488 http://notmuchmail.org/mailman/listinfo/notmuch\r