On Wed, Dec 22 2021, Eric Abrahamsen wrote:
[...]
> You have done heroic work, and I hope it may yet be unnecessary for me
> to install and configure notmuch. Telling notmuch what to do with
> "thread:xxx" queries is not difficult, and I should have a solution for
> this in the next day or so.
i fear you'll have to install it. the naive fixes below
(properly set a query with (query . "thread:xxxxxxxxx") rather than the
raw string, and eliminating --duplicate for thread searches) end up
performing the query in nnselect group, rather than moving to the parent
group.
cheers,
jao
(cl-defmethod gnus-search-run-search :around ((engine gnus-search-notmuch)
server query groups)
"Handle notmuch's thread-search routine."
;; Notmuch allows for searching threads, but only using its own
;; thread ids. That means a thread search is a \"double-bounce\":
;; once to find the relevant thread ids, and again to find the
;; actual messages. This method performs the first \"bounce\".
(if (alist-get 'thread query)
(with-slots (program proc-buffer) engine
(let* ((qstring
(gnus-search-make-query-string engine query))
(cp-list (gnus-search-indexed-search-command
engine qstring query groups))
thread-ids proc)
(set-buffer proc-buffer)
(erase-buffer)
(setq proc (apply #'start-process (format "search-%s" server)
proc-buffer program cp-list))
(while (process-live-p proc)
(accept-process-output proc))
(goto-char (point-min))
(while (re-search-forward "^thread:\\([^\n ]+\\)" (point-max) t)
(push (match-string 0) thread-ids))
(cl-call-next-method
engine server
;; Completely replace the query with our new thread-based one.
`((query . ,(mapconcat 'identity thread-ids " or ")))
;;;;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
nil)))
(cl-call-next-method engine server query groups)))
(cl-defmethod gnus-search-indexed-search-command ((engine gnus-search-notmuch)
(qstring string)
query &optional _groups)
;; Theoretically we could use the GROUPS parameter to pass a
;; --folder switch to notmuch, but I'm not confident of getting the
;; format right.
(let ((limit (alist-get 'limit query))
(thread (alist-get 'thread query)))
(with-slots (switches config-file) engine
`(,(format "--config=%s" config-file)
"search"
,(if thread
"--output=threads"
"--output=files")
,@(unless thread '("--duplicate=1"))
; I have found this necessary, I don't
know why.
;;;;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
,@switches
,(if limit (format "--limit=%d" limit) "")
,qstring
))))