info-gnus-english
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: gnus-search-engine set to gnus-search-notmuch and refer threads


From: Jose A. Ortega Ruiz
Subject: Re: gnus-search-engine set to gnus-search-notmuch and refer threads
Date: Thu, 23 Dec 2021 03:34:32 +0000
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux)

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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]