diff options
| author | Andrew G Cohen | 2022-02-11 15:09:46 +0800 |
|---|---|---|
| committer | Andrew G Cohen | 2022-02-11 15:09:46 +0800 |
| commit | 48e8569c8772ed4cb2af299e353e7376606992be (patch) | |
| tree | 0817d9d4bfe234fdf853c36b8bec59d9dc68992b | |
| parent | 20da50619fd5b65e6d0c18c48d10ab1ec9067b63 (diff) | |
| download | emacs-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.el | 6 | ||||
| -rw-r--r-- | lisp/gnus/gnus-search.el | 39 | ||||
| -rw-r--r-- | lisp/gnus/nnselect.el | 3 |
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 | ||