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 ))))