diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el index d64c0cb90c..bb7fd47eb6 100644 --- a/lisp/gnus/gnus-search.el +++ b/lisp/gnus/gnus-search.el @@ -1606,13 +1606,17 @@ gnus-search-run-search proc-buffer program cp-list)) (while (process-live-p proc) (accept-process-output proc)) - (while (re-search-forward "^thread:\\([^ ]+\\)" (point-max) t) - (push (match-string 1) thread-ids)) + (goto-char (point-min)) + (while (re-search-forward "^thread:\\([^[:space:]\n]+\\)" (point-max) t) + (cl-pushnew (match-string 1) thread-ids :test #'equal)) (cl-call-next-method engine server - ;; Completely replace the query with our new thread-based one. - (mapconcat (lambda (thrd) (concat "thread:" thrd)) - thread-ids " or ") + ;; If we found threads, completely replace the query with + ;; our new thread-based one. + (if thread-ids + (mapconcat (lambda (thrd) (concat "thread:" thrd)) + thread-ids " or ") + query) nil))) (cl-call-next-method engine server query groups))) @@ -1629,8 +1633,9 @@ gnus-search-indexed-search-command "search" ,(if thread "--output=threads" - "--output=files") - "--duplicate=1" ; I have found this necessary, I don't know why. + ;; No one knows why this "duplicate" flag is necessary, but + ;; it doesn't work with a thread search. + "--output=files --duplicate=1") ,@switches ,(if limit (format "--limit=%d" limit) "") ,qstring