From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Andrea Monaco Newsgroups: gmane.emacs.devel Subject: Re: [PATCH v3] Allow applying filters to summary consecutively Date: Mon, 07 Nov 2022 15:13:13 +0100 Message-ID: <874jvaont2.fsf@autistici.org> References: <8335aw35a1.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="35748"; mail-complaints-to="usenet@ciao.gmane.io" Cc: rms@gnu.org, rpluim@gmail.com, emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Mon Nov 07 15:14:25 2022 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1os2tN-00095Y-Jn for ged-emacs-devel@m.gmane-mx.org; Mon, 07 Nov 2022 15:14:25 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1os2sW-0002hz-Ny; Mon, 07 Nov 2022 09:13:32 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1os2sV-0002hm-EZ for emacs-devel@gnu.org; Mon, 07 Nov 2022 09:13:31 -0500 Original-Received: from devianza.investici.org ([198.167.222.108]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1os2sT-0007VR-3F; Mon, 07 Nov 2022 09:13:31 -0500 Original-Received: from mx2.investici.org (unknown [127.0.0.1]) by devianza.investici.org (Postfix) with ESMTP id 4N5Y9S1DVbz6vFC; Mon, 7 Nov 2022 14:13:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=autistici.org; s=stigmate; t=1667830396; bh=YqPqbFRnpKKoXBgAiwURjEyuEu+vj+G5zaflVu8s/Os=; h=From:To:Cc:Subject:In-Reply-To:Date:From; b=nZKSn2d9Y3OH8yQhPvSe7jubHkSrVF3lSvL9EtcjHgZcNNH7QAt9eS3LhUkxnANsY akOmBPDvFJpgy6Vlw5QFTRtJBp2suPm6jm8UW10NE8ih/T7kqJrNjEaqmcIEtIakLD f5iX1RxCiUF4+K6/q8NUltNmHjIPPWe652ST2Q3s= Original-Received: from [198.167.222.108] (mx2.investici.org [198.167.222.108]) (Authenticated sender: andrea.monaco@autistici.org) by localhost (Postfix) with ESMTPSA id 4N5Y9R5TxMz6vC0; Mon, 7 Nov 2022 14:13:15 +0000 (UTC) In-Reply-To: <8335aw35a1.fsf@gnu.org> (message from Eli Zaretskii on Sun, 06 Nov 2022 09:34:30 +0200) Received-SPF: pass client-ip=198.167.222.108; envelope-from=andrea.monaco@autistici.org; helo=devianza.investici.org X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:299294 Archived-At: 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))