diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el index 605d8a34e9..871163c38b 100644 --- a/lisp/gnus/gnus-search.el +++ b/lisp/gnus/gnus-search.el @@ -1396,17 +1396,22 @@ gnus-search-indexed-parse-output (file-readable-p f-name) (null (file-directory-p f-name))) (setq group - (replace-regexp-in-string - "[/\\]" "." - (replace-regexp-in-string - "/?\\(cur\\|new\\|tmp\\)?/\\'" "" + (delete + "" + (file-name-split (replace-regexp-in-string - "\\`\\." "" - (string-remove-prefix + "\\`\\." "" ; Why do we do this? + (string-remove-prefix prefix (file-name-directory f-name)) - nil t) - nil t) - nil t)) + nil t))) + ;; Turn file name segments into Gnus group name. + group (mapconcat + #'identity + (if (member (car (last group)) + '("new" "tmp" "cur")) + (nbutlast group) + group) + ".")) (setq article (file-name-nondirectory f-name) article ;; TODO: Provide a cleaner way of producing final @@ -1434,6 +1439,14 @@ gnus-search-indexed-parse-output (string-to-number score)))) artlist))) +(cl-defmethod gnus-search-indexed-extract :around + ((_engine gnus-search-indexed)) + (let ((ret (cl-call-next-method))) + ;; We run `expand-file-name' here in order to collapse multiple + ;; consecutive directory separators. + (cl-callf expand-file-name (car ret)) + ret)) + (cl-defmethod gnus-search-indexed-extract ((_engine gnus-search-indexed)) "Base implementation treats the whole line as a filename, and fudges a relevancy score of 100."