aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew G Cohen2022-02-11 15:09:46 +0800
committerAndrew G Cohen2022-02-11 15:09:46 +0800
commit48e8569c8772ed4cb2af299e353e7376606992be (patch)
tree0817d9d4bfe234fdf853c36b8bec59d9dc68992b
parent20da50619fd5b65e6d0c18c48d10ab1ec9067b63 (diff)
downloademacs-48e8569c8772ed4cb2af299e353e7376606992be.tar.gz
emacs-48e8569c8772ed4cb2af299e353e7376606992be.zip
Allow searching of nnselect (search) groups
* lisp/gnus/gnus-group.el (gnus-group-make-search-group): (gnus-group-read-ephemeral-search-group): Ensure the server is correctly identified even for nnselect groups. * lisp/gnus/gnus-search.el (gnus-search-nnselect): New function. (gnus-search-default-engines): Use it. (gnus-search-make-spec): Queries from nnselect should always be raw. * lisp/gnus/nnselect.el (gnus-search): Silence the byte-compiler.
-rw-r--r--lisp/gnus/gnus-group.el6
-rw-r--r--lisp/gnus/gnus-search.el39
-rw-r--r--lisp/gnus/nnselect.el3
3 files changed, 42 insertions, 6 deletions
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index 8937df26017..e59a9723509 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -3226,7 +3226,8 @@ non-nil SPECS arg must be an alist with `search-query-spec' and
3226 (if (gnus-server-server-name) 3226 (if (gnus-server-server-name)
3227 (list (list (gnus-server-server-name))) 3227 (list (list (gnus-server-server-name)))
3228 (seq-group-by 3228 (seq-group-by
3229 (lambda (elt) (gnus-group-server elt)) 3229 (lambda (elt) (gnus-method-to-server
3230 (gnus-find-method-for-group elt)))
3230 (or gnus-group-marked 3231 (or gnus-group-marked
3231 (if (gnus-group-group-name) 3232 (if (gnus-group-group-name)
3232 (list (gnus-group-group-name)) 3233 (list (gnus-group-group-name))
@@ -3277,7 +3278,8 @@ non-nil SPECS arg must be an alist with `search-query-spec' and
3277 (if (gnus-server-server-name) 3278 (if (gnus-server-server-name)
3278 (list (list (gnus-server-server-name))) 3279 (list (list (gnus-server-server-name)))
3279 (seq-group-by 3280 (seq-group-by
3280 (lambda (elt) (gnus-group-server elt)) 3281 (lambda (elt) (gnus-method-to-server
3282 (gnus-find-method-for-group elt)))
3281 (or gnus-group-marked 3283 (or gnus-group-marked
3282 (if (gnus-group-group-name) 3284 (if (gnus-group-group-name)
3283 (list (gnus-group-group-name)) 3285 (list (gnus-group-group-name))
diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el
index bf88abae76c..4babe9f96f0 100644
--- a/lisp/gnus/gnus-search.el
+++ b/lisp/gnus/gnus-search.el
@@ -762,6 +762,9 @@ the files in ARTLIST by that search key.")
762 (generate-new-buffer " *gnus-search-"))) 762 (generate-new-buffer " *gnus-search-")))
763 (cl-call-next-method engine slots)) 763 (cl-call-next-method engine slots))
764 764
765(defclass gnus-search-nnselect (gnus-search-engine)
766 nil)
767
765(defclass gnus-search-imap (gnus-search-engine) 768(defclass gnus-search-imap (gnus-search-engine)
766 ((literal-plus 769 ((literal-plus
767 :initarg :literal-plus 770 :initarg :literal-plus
@@ -907,13 +910,15 @@ quirks.")
907(define-obsolete-variable-alias 'nnir-method-default-engines 910(define-obsolete-variable-alias 'nnir-method-default-engines
908 'gnus-search-default-engines "28.1") 911 'gnus-search-default-engines "28.1")
909 912
910(defcustom gnus-search-default-engines '((nnimap . gnus-search-imap)) 913(defcustom gnus-search-default-engines '((nnimap . gnus-search-imap)
914 (nnselect . gnus-search-nnselect))
911 "Alist of default search engines keyed by server method." 915 "Alist of default search engines keyed by server method."
912 :version "26.1" 916 :version "26.1"
913 :type `(repeat (cons (choice (const nnimap) (const nntp) (const nnspool) 917 :type `(repeat (cons (choice (const nnimap) (const nntp) (const nnspool)
914 (const nneething) (const nndir) (const nnmbox) 918 (const nneething) (const nndir) (const nnmbox)
915 (const nnml) (const nnmh) (const nndraft) 919 (const nnml) (const nnmh) (const nndraft)
916 (const nnfolder) (const nnmaildir)) 920 (const nnfolder) (const nnmaildir)
921 (const nnselect))
917 (choice 922 (choice
918 ,@(mapcar 923 ,@(mapcar
919 (lambda (el) (list 'const (intern (car el)))) 924 (lambda (el) (list 'const (intern (car el))))
@@ -1010,6 +1015,33 @@ Responsible for handling and, or, and parenthetical expressions.")
1010 unseen all old new or not) 1015 unseen all old new or not)
1011 "Known IMAP search keys.") 1016 "Known IMAP search keys.")
1012 1017
1018(autoload 'nnselect-categorize "nnselect")
1019(autoload 'nnselect-get-artlist "nnselect" nil nil 'macro)
1020(autoload 'ids-by-group "nnselect")
1021;; nnselect interface
1022(cl-defmethod gnus-search-run-search ((_engine gnus-search-nnselect)
1023 _srv query-spec groups)
1024 (let ((artlist []))
1025 (dolist (group groups)
1026 (let* ((gnus-newsgroup-selection (nnselect-get-artlist group))
1027 (group-spec
1028 (nnselect-categorize
1029 (mapcar 'car
1030 (ids-by-group
1031 (number-sequence 1
1032 (length gnus-newsgroup-selection))))
1033 (lambda (x)
1034 (gnus-group-server x)))))
1035 (setq artlist
1036 (vconcat artlist
1037 (seq-intersection
1038 gnus-newsgroup-selection
1039 (gnus-search-run-query
1040 (list (cons 'search-query-spec query-spec)
1041 (cons 'search-group-spec group-spec))))))))
1042 artlist))
1043
1044
1013;; imap interface 1045;; imap interface
1014(cl-defmethod gnus-search-run-search ((engine gnus-search-imap) 1046(cl-defmethod gnus-search-run-search ((engine gnus-search-imap)
1015 srv query groups) 1047 srv query groups)
@@ -2155,7 +2187,8 @@ article came from is also searched."
2155 (read-from-minibuffer 2187 (read-from-minibuffer
2156 "Query: " nil gnus-search-minibuffer-map 2188 "Query: " nil gnus-search-minibuffer-map
2157 nil 'gnus-search-history))) 2189 nil 'gnus-search-history)))
2158 (cons 'raw arg))) 2190 (cons 'raw
2191 (or (gnus-nnselect-group-p (gnus-group-group-name)) arg))))
2159 2192
2160(provide 'gnus-search) 2193(provide 'gnus-search)
2161;;; gnus-search.el ends here 2194;;; gnus-search.el ends here
diff --git a/lisp/gnus/nnselect.el b/lisp/gnus/nnselect.el
index f8a0c33d4e5..f5be477d26d 100644
--- a/lisp/gnus/nnselect.el
+++ b/lisp/gnus/nnselect.el
@@ -47,7 +47,8 @@
47;;; Setup: 47;;; Setup:
48 48
49(require 'gnus-art) 49(require 'gnus-art)
50(require 'gnus-search) 50(autoload 'gnus-search-run-query "gnus-search")
51(autoload 'gnus-search-server-to-engine "gnus-search")
51 52
52(eval-when-compile (require 'cl-lib)) 53(eval-when-compile (require 'cl-lib))
53 54