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: Wed, 19 Oct 2022 16:23:13 +0200 Message-ID: <87k04vj3ji.fsf@autistici.org> References: Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="18700"; mail-complaints-to="usenet@ciao.gmane.io" Cc: rpluim@gmail.com, eliz@gnu.org, emacs-devel@gnu.org To: rms@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Wed Oct 19 16:26:27 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 1olA1b-0004d3-3C for ged-emacs-devel@m.gmane-mx.org; Wed, 19 Oct 2022 16:26:27 +0200 Original-Received: from localhost ([::1]:54990 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1olA1Y-0004kv-Ob for ged-emacs-devel@m.gmane-mx.org; Wed, 19 Oct 2022 10:26:24 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:40402) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ol9yi-0002Vx-JD for emacs-devel@gnu.org; Wed, 19 Oct 2022 10:23:28 -0400 Original-Received: from devianza.investici.org ([198.167.222.108]:48283) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ol9yf-0001L6-JX; Wed, 19 Oct 2022 10:23:28 -0400 Original-Received: from mx2.investici.org (unknown [127.0.0.1]) by devianza.investici.org (Postfix) with ESMTP id 4MstHm0gqxz6vMR; Wed, 19 Oct 2022 14:23:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=autistici.org; s=stigmate; t=1666189396; bh=VBmyFqBlxvDpLUJ3ZB7jiuGA0jvypJ8k1QUcXQyVA28=; h=From:To:Cc:Subject:In-Reply-To:Date:From; b=i6fNrpvr7VmvDXVRKWfAx6NFeNohk0VGJGg0lDhzCa+ey2C++JxR1LCAMRZcL/lh2 M4xk96B+9fBjt0G7H0RyX5w4V74qcBkke69W76XhA9+qz00EPiaaBHVYrqjIm8hMkY 3FKlVIehCqOo2NchQlwF4Qemz/i6JrsRDW1a5KqM= 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 4MstHl4fjBz6vMJ; Wed, 19 Oct 2022 14:23:15 +0000 (UTC) In-Reply-To: (message from Richard Stallman on Wed, 12 Oct 2022 18:02:29 -0400) 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" Xref: news.gmane.io gmane.emacs.devel:298117 Archived-At: I introduced a configuration item called rmail-summary-apply-filters-consecutively. When set to non-nil, the filters stack. I also removed the KEEP-FILTERING argument that I previously added, because it is no longer needed now that there's a global switch. Andrea Monaco diff --git a/lisp/mail/rmailsum.el b/lisp/mail/rmailsum.el index b959f45250..7f000ea014 100644 --- a/lisp/mail/rmailsum.el +++ b/lisp/mail/rmailsum.el @@ -50,6 +50,20 @@ rmail-summary-line-count-flag :type 'boolean :group 'rmail-summary) +(defcustom rmail-summary-apply-filters-consecutively nil + "Non-nil means that commands rmail-summary-by-* works on the +current summary and so can be stacked one after the other." + :type 'boolean + :group 'rmail-summary) + +(defvar rmail-summary-currently-displayed-msgs nil + "String made of 'y' and 'n'. At index i it tells wether +message i is shown on the summary or not. First character is +ignored. Used when applying rmail-summary-by-* commands +consecutively. Filled by +rmail-summary-fill-displayed-messages.") +(put 'rmail-summary-currently-displayed-msgs 'permanent-local t) + (defvar rmail-summary-font-lock-keywords '(("^ *[0-9]+D.*" . font-lock-string-face) ; Deleted. ("^ *[0-9]+-.*" . font-lock-type-face) ; Unread. @@ -267,6 +281,35 @@ 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." + (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))))) + +(defun rmail-summary-negate () + "Negate the current summary. That is, show the messages that +are not displayed, and vice versa." + (interactive) + (rmail-summary-fill-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))))) + ;;;###autoload (defun rmail-summary () "Display a summary of all messages, one line per message." @@ -282,9 +325,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)) (rmail-new-summary (concat "labels " labels) (list 'rmail-summary-by-labels labels) - 'rmail-message-labels-p + (if rmail-summary-apply-filters-consecutively + (lambda (msg l) + (and (= (aref rmail-summary-currently-displayed-msgs msg) + ?y) + (rmail-message-labels-p msg l))) + 'rmail-message-labels-p) (concat " \\(" (mail-comma-list-regexp labels) "\\)\\(,\\|\\'\\)"))) @@ -297,10 +347,18 @@ 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)) (rmail-new-summary (concat "recipients " recipients) (list 'rmail-summary-by-recipients recipients primary-only) - 'rmail-message-recipients-p recipients primary-only)) + (if rmail-summary-apply-filters-consecutively + (lambda (msg r &optional po) + (and (= (aref rmail-summary-currently-displayed-msgs msg) + ?y) + (rmail-message-recipients-p msg r po))) + 'rmail-message-recipients-p) + recipients primary-only)) (defun rmail-message-recipients-p (msg recipients &optional primary-only) (rmail-apply-in-message msg 'rmail-message-recipients-p-1 @@ -328,9 +386,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)) (rmail-new-summary (concat "regexp " regexp) (list 'rmail-summary-by-regexp regexp) - 'rmail-message-regexp-p + (if rmail-summary-apply-filters-consecutively + (lambda (msg r) + (and (= (aref rmail-summary-currently-displayed-msgs msg) + ?y) + (rmail-message-regexp-p msg r))) + 'rmail-message-regexp-p) regexp)) (defun rmail-message-regexp-p (msg regexp) @@ -365,7 +430,7 @@ rmail-message-regexp-p-1 ;;;###autoload (defun rmail-summary-by-topic (subject &optional whole-message) "Display a summary of all messages with the given SUBJECT. -Normally checks just the Subject field of headers; but with prefix +Normally checks just the Subject field of headers; but when prefix argument WHOLE-MESSAGE is non-nil, looks in the whole message. SUBJECT is a regular expression." (interactive @@ -376,10 +441,18 @@ 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)) (rmail-new-summary (concat "about " subject) (list 'rmail-summary-by-topic subject whole-message) - 'rmail-message-subject-p subject whole-message)) + (if rmail-summary-apply-filters-consecutively + (lambda (msg s &optional wm) + (and (= (aref rmail-summary-currently-displayed-msgs msg) + ?y) + (rmail-message-subject-p msg s wm))) + 'rmail-message-subject-p) + subject whole-message)) (defun rmail-message-subject-p (msg subject &optional whole-message) (if whole-message @@ -402,9 +475,18 @@ 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)) (rmail-new-summary (concat "senders " senders) - (list 'rmail-summary-by-senders senders) 'rmail-message-senders-p senders)) + (list 'rmail-summary-by-senders senders) + (if rmail-summary-apply-filters-consecutively + (lambda (msg s) + (and (= (aref rmail-summary-currently-displayed-msgs msg) + ?y) + (rmail-message-senders-p msg s))) + 'rmail-message-senders-p) + senders)) (defun rmail-message-senders-p (msg senders) (string-match senders (or (rmail-get-header "From" msg) "")))