The words "negate" and "intersect" come from logic and mathematics. They might not be especially common, but they are very precise. So I kept them and expanded on their meaning in the rest of the docstrings. Andrea Monaco diff --git a/lisp/mail/rmailsum.el b/lisp/mail/rmailsum.el index 0144a34e5e..011a0e81ac 100644 --- a/lisp/mail/rmailsum.el +++ b/lisp/mail/rmailsum.el @@ -50,21 +50,19 @@ rmail-summary-line-count-flag :type 'boolean :group 'rmail-summary) -(defcustom rmail-summary-apply-filters-consecutively nil - "If non-nil, Rmail summary commands apply filtering on top existing filtering. -When this variable is non-nil, `rmail-summary-by-*' commands work on the -current summary, and so their filtering can be stacked one on top of another. -This allows gradual narrowing of the selection of the messages." +(defcustom rmail-summary-intersect-consecutive-filters nil + "Non-nil means that consecutive rmail-summary-by-* commands intersect. +This way, the user can apply one filter after the other and keep +narrowing the result." :type 'boolean :version "29.1" :group 'rmail-summary) (defvar rmail-summary-currently-displayed-msgs nil - "String made of `y' and `n'. -The character at position i tells wether message i is shown in the -summary or not. First character is ignored. -Used when applying `rmail-summary-by-*' commands consecutively. Filled -by `rmail-summary-fill-displayed-messages'.") + "Boolean vector that tells which messages are displayed in the summary. +First element is ignored. Used when applying rmail-summary-by-* +commands consecutively. Filled by +`rmail-summary-populate-displayed-messages'.") (put 'rmail-summary-currently-displayed-msgs 'permanent-local t) (defvar rmail-summary-font-lock-keywords @@ -284,33 +282,40 @@ rmail-summary-mode-map (defun rmail-update-summary (&rest _) (apply (car rmail-summary-redo) (cdr rmail-summary-redo))) -(defun rmail-summary-fill-displayed-messages () - "Fill the rmail-summary-currently-displayed-msgs string." +(defun rmail-summary-populate-displayed-messages () + "Populate the `rmail-summary-currently-displayed-msgs' vector." (with-current-buffer rmail-buffer - (with-current-buffer rmail-summary-buffer - (setq rmail-summary-currently-displayed-msgs - (make-string (1+ rmail-total-messages) ?n)) - (goto-char (point-min)) - (while (not (eobp)) - (aset rmail-summary-currently-displayed-msgs - (string-to-number (thing-at-point 'line)) - ?y) - (forward-line 1))))) + (let ((totmsgs rmail-total-messages)) + (with-current-buffer rmail-summary-buffer + (setq rmail-summary-currently-displayed-msgs + (make-bool-vector (1+ totmsgs) nil)) + (goto-char (point-min)) + (while (not (eobp)) + (aset rmail-summary-currently-displayed-msgs + (string-to-number (thing-at-point 'line)) + t) + (forward-line 1)))))) (defun rmail-summary-negate () - "Toggle display of messages that match the summary and those which do not." + "Negate the current summary. +That is, show the messages that are not displayed, and vice +versa." (interactive) - (rmail-summary-fill-displayed-messages) + (rmail-summary-populate-displayed-messages) (rmail-new-summary "Negate" '(rmail-summary-by-regexp ".*") (lambda (msg) (if - (= (aref rmail-summary-currently-displayed-msgs msg) - ?n) - (progn - (aset rmail-summary-currently-displayed-msgs msg ?y) t) - (progn - (aset rmail-summary-currently-displayed-msgs msg ?n) nil))))) + (eq (aref rmail-summary-currently-displayed-msgs msg) + nil) + (aset rmail-summary-currently-displayed-msgs msg t) + (aset rmail-summary-currently-displayed-msgs msg nil))))) + +(defun rmail-summary--exists-1 () + "Like `rmail-summary-exists', but works in both main and summary buffers." + (with-current-buffer rmail-buffer + (and rmail-summary-buffer (buffer-name rmail-summary-buffer) + rmail-summary-buffer))) ;;;###autoload (defun rmail-summary () @@ -327,14 +332,16 @@ rmail-summary-by-labels (setq labels (or rmail-last-multi-labels (error "No label specified")))) (setq rmail-last-multi-labels labels) - (if rmail-summary-apply-filters-consecutively - (rmail-summary-fill-displayed-messages)) + (if (and rmail-summary-intersect-consecutive-filters + (rmail-summary--exists-1)) + (rmail-summary-populate-displayed-messages)) (rmail-new-summary (concat "labels " labels) (list 'rmail-summary-by-labels labels) - (if rmail-summary-apply-filters-consecutively + (if (and rmail-summary-intersect-consecutive-filters + (rmail-summary--exists-1)) (lambda (msg l) - (and (= (aref rmail-summary-currently-displayed-msgs msg) - ?y) + (and (eq (aref rmail-summary-currently-displayed-msgs msg) + t) (rmail-message-labels-p msg l))) 'rmail-message-labels-p) (concat " \\(" @@ -349,15 +356,17 @@ rmail-summary-by-recipients only look in the To and From fields. RECIPIENTS is a regular expression." (interactive "sRecipients to summarize by: \nP") - (if rmail-summary-apply-filters-consecutively - (rmail-summary-fill-displayed-messages)) + (if (and rmail-summary-intersect-consecutive-filters + (rmail-summary--exists-1)) + (rmail-summary-populate-displayed-messages)) (rmail-new-summary (concat "recipients " recipients) (list 'rmail-summary-by-recipients recipients primary-only) - (if rmail-summary-apply-filters-consecutively + (if (and rmail-summary-intersect-consecutive-filters + (rmail-summary--exists-1)) (lambda (msg r &optional po) - (and (= (aref rmail-summary-currently-displayed-msgs msg) - ?y) + (and (eq (aref rmail-summary-currently-displayed-msgs msg) + t) (rmail-message-recipients-p msg r po))) 'rmail-message-recipients-p) recipients primary-only)) @@ -388,14 +397,16 @@ rmail-summary-by-regexp (setq regexp (or rmail-last-regexp (error "No regexp specified")))) (setq rmail-last-regexp regexp) - (if rmail-summary-apply-filters-consecutively - (rmail-summary-fill-displayed-messages)) + (if (and rmail-summary-intersect-consecutive-filters + (rmail-summary--exists-1)) + (rmail-summary-populate-displayed-messages)) (rmail-new-summary (concat "regexp " regexp) (list 'rmail-summary-by-regexp regexp) - (if rmail-summary-apply-filters-consecutively + (if (and rmail-summary-intersect-consecutive-filters + (rmail-summary--exists-1)) (lambda (msg r) - (and (= (aref rmail-summary-currently-displayed-msgs msg) - ?y) + (and (eq (aref rmail-summary-currently-displayed-msgs msg) + t) (rmail-message-regexp-p msg r))) 'rmail-message-regexp-p) regexp)) @@ -443,15 +454,17 @@ rmail-summary-by-topic (if subject ", default current subject" "") "): "))) (list (read-string prompt nil nil subject) current-prefix-arg))) - (if rmail-summary-apply-filters-consecutively - (rmail-summary-fill-displayed-messages)) + (if (and rmail-summary-intersect-consecutive-filters + (rmail-summary--exists-1)) + (rmail-summary-populate-displayed-messages)) (rmail-new-summary (concat "about " subject) (list 'rmail-summary-by-topic subject whole-message) - (if rmail-summary-apply-filters-consecutively + (if (and rmail-summary-intersect-consecutive-filters + (rmail-summary--exists-1)) (lambda (msg s &optional wm) - (and (= (aref rmail-summary-currently-displayed-msgs msg) - ?y) + (and (eq (aref rmail-summary-currently-displayed-msgs msg) + t) (rmail-message-subject-p msg s wm))) 'rmail-message-subject-p) subject whole-message)) @@ -477,15 +490,17 @@ rmail-summary-by-senders (if sender ", default this message's sender" "") "): "))) (list (read-string prompt nil nil sender)))) - (if rmail-summary-apply-filters-consecutively - (rmail-summary-fill-displayed-messages)) + (if (and rmail-summary-intersect-consecutive-filters + (rmail-summary--exists-1)) + (rmail-summary-populate-displayed-messages)) (rmail-new-summary (concat "senders " senders) (list 'rmail-summary-by-senders senders) - (if rmail-summary-apply-filters-consecutively + (if (and rmail-summary-intersect-consecutive-filters + (rmail-summary--exists-1)) (lambda (msg s) - (and (= (aref rmail-summary-currently-displayed-msgs msg) - ?y) + (and (eq (aref rmail-summary-currently-displayed-msgs msg) + t) (rmail-message-senders-p msg s))) 'rmail-message-senders-p) senders))
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4