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 v2] Allow applying filters to summary consecutively (was: Summary by thread in rmail) Date: Tue, 11 Oct 2022 09:16:52 +0200 Message-ID: <87sfju7rtn.fsf@autistici.org> References: <83sfjwgio4.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="31427"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel@gnu.org, rms@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Tue Oct 11 09:53:37 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 1oiA52-0007yF-9z for ged-emacs-devel@m.gmane-mx.org; Tue, 11 Oct 2022 09:53:36 +0200 Original-Received: from localhost ([::1]:34162 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oiA51-0006li-2d for ged-emacs-devel@m.gmane-mx.org; Tue, 11 Oct 2022 03:53:35 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:51304) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oi9Vz-0008KQ-Ab for emacs-devel@gnu.org; Tue, 11 Oct 2022 03:17:28 -0400 Original-Received: from confino.investici.org ([93.190.126.19]:52429) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oi9Vi-0000S3-E0; Tue, 11 Oct 2022 03:17:22 -0400 Original-Received: from mx1.investici.org (unknown [127.0.0.1]) by confino.investici.org (Postfix) with ESMTP id 4MmnCV0HbFz112Z; Tue, 11 Oct 2022 07:16:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=autistici.org; s=stigmate; t=1665472614; bh=xWEbcGSsORHDSxdtve5Zx5EuBtp1USHDR5UiNm7SfAg=; h=From:To:Cc:Subject:In-Reply-To:Date:From; b=ZJsMl9fyWVZgOmToZY74qMsQxf2ihflL4Zkrukx0puEtr3SIVWtzZZh2gLT1U/kyW PrtFGITt4zo/zM3SQBraFX+bJzrlD0qaHAlwItOzkbE5gsc+nQ7ng9oA6J+r1zNLhc 3uYWnRSHiVHmQpqXA9hxYLuTyowJqaSgT/cOkNT0= Original-Received: from [93.190.126.19] (mx1.investici.org [93.190.126.19]) (Authenticated sender: andrea.monaco@autistici.org) by localhost (Postfix) with ESMTPSA id 4MmnCT662Xz112N; Tue, 11 Oct 2022 07:16:53 +0000 (UTC) In-Reply-To: <83sfjwgio4.fsf@gnu.org> (message from Eli Zaretskii on Mon, 10 Oct 2022 11:57:31 +0300) Received-SPF: pass client-ip=93.190.126.19; envelope-from=andrea.monaco@autistici.org; helo=confino.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, 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:297440 Archived-At: rmail-summary-by-recipients and rmail-summary-by-topic already use the prefix argument for every non-nil value, so I don't know how to proceed. I applied all other changes. Andrea Monaco diff --git a/lisp/mail/rmailsum.el b/lisp/mail/rmailsum.el index b959f45250..5e51a8cd20 100644 --- a/lisp/mail/rmailsum.el +++ b/lisp/mail/rmailsum.el @@ -50,6 +50,13 @@ rmail-summary-line-count-flag :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.") +(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 +274,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 ".*" t) + (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." @@ -274,33 +310,52 @@ rmail-summary (rmail-new-summary "All" '(rmail-summary) nil)) ;;;###autoload -(defun rmail-summary-by-labels (labels) +(defun rmail-summary-by-labels (labels &optional keep-filtering) "Display a summary of all messages with one or more LABELS. -LABELS should be a string containing the desired labels, separated by commas." - (interactive "sLabels to summarize by: ") +LABELS should be a string containing the desired labels, separated by commas. + If KEEP-FILTERING is non-nil or prefix argument is given, operate on the +current summary instead of all mail." + (interactive "sLabels to summarize by: \nP") (if (string= labels "") (setq labels (or rmail-last-multi-labels (error "No label specified")))) (setq rmail-last-multi-labels labels) + (if keep-filtering + (rmail-summary-fill-displayed-messages)) (rmail-new-summary (concat "labels " labels) - (list 'rmail-summary-by-labels labels) - 'rmail-message-labels-p + (list 'rmail-summary-by-labels labels keep-filtering) + (if keep-filtering + (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) "\\)\\(,\\|\\'\\)"))) ;;;###autoload -(defun rmail-summary-by-recipients (recipients &optional primary-only) +(defun rmail-summary-by-recipients (recipients &optional primary-only keep-filtering) "Display a summary of all messages with the given RECIPIENTS. Normally checks the To, From and Cc fields of headers; but if PRIMARY-ONLY is non-nil (prefix arg given), only look in the To and From fields. -RECIPIENTS is a regular expression." +RECIPIENTS is a regular expression. + If KEEP-FILTERING is non-nil, operate on the current summary +instead of all mail." (interactive "sRecipients to summarize by: \nP") + (if keep-filtering + (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)) + (list 'rmail-summary-by-recipients recipients primary-only keep-filtering) + (if keep-filtering + (lambda (msg r) + (and (= (aref rmail-summary-currently-displayed-msgs msg) + ?y) + (rmail-message-recipients-p msg r))) + '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 @@ -318,19 +373,28 @@ rmail-message-recipients-p-1 ;; Also, the optional WHOLE-MESSAGE argument of r-s-by-topic would ;; seem more natural here. ;;;###autoload -(defun rmail-summary-by-regexp (regexp) +(defun rmail-summary-by-regexp (regexp &optional keep-filtering) "Display a summary of all messages according to regexp REGEXP. If the regular expression is found in the header of the message \(including in the date and other lines, as well as the subject line), -Emacs will list the message in the summary." - (interactive "sRegexp to summarize by: ") +Emacs will list the message in the summary. + If KEEP-FILTERING is non-nil or prefix argument is given, operate +on the current summary instead of all mail." + (interactive "sRegexp to summarize by: \nP") (if (string= regexp "") (setq regexp (or rmail-last-regexp (error "No regexp specified")))) (setq rmail-last-regexp regexp) + (if keep-filtering + (rmail-summary-fill-displayed-messages)) (rmail-new-summary (concat "regexp " regexp) - (list 'rmail-summary-by-regexp regexp) - 'rmail-message-regexp-p + (list 'rmail-summary-by-regexp regexp keep-filtering) + (if keep-filtering + (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) @@ -363,11 +427,13 @@ rmail-message-regexp-p-1 (rmail--decode-and-apply 're-search-forward regexp nil t))) ;;;###autoload -(defun rmail-summary-by-topic (subject &optional whole-message) +(defun rmail-summary-by-topic (subject &optional whole-message keep-filtering) "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." +SUBJECT is a regular expression. + If KEEP-FILTERING is non-nil, operate on the current summary +instead of all mail." (interactive ;; We quote the default subject, because if it contains regexp ;; special characters (eg "?"), it can fail to match itself. (Bug#2333) @@ -376,10 +442,18 @@ rmail-summary-by-topic (if subject ", default current subject" "") "): "))) (list (read-string prompt nil nil subject) current-prefix-arg))) + (if keep-filtering + (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)) + (list 'rmail-summary-by-topic subject whole-message keep-filtering) + (if keep-filtering + (lambda (msg s wo) + (and (= (aref rmail-summary-currently-displayed-msgs msg) + ?y) + (rmail-message-subject-p msg s wo))) + 'rmail-message-subject-p) + subject whole-message)) (defun rmail-message-subject-p (msg subject &optional whole-message) (if whole-message @@ -389,10 +463,12 @@ rmail-message-subject-p (string-match subject (rmail-simplified-subject msg)))) ;;;###autoload -(defun rmail-summary-by-senders (senders) +(defun rmail-summary-by-senders (senders &optional keep-filtering) "Display a summary of all messages whose \"From\" field matches SENDERS. SENDERS is a regular expression. The default for SENDERS matches the -sender of the current message." +sender of the current message. + If KEEP-FILTERING is non-nil or prefix argument is given, operate on +the current summary instead of all mail." (interactive (let* ((def (rmail-get-header "From")) ;; We quote the default argument, because if it contains regexp @@ -401,10 +477,20 @@ rmail-summary-by-senders (prompt (concat "Senders to summarize by (regexp" (if sender ", default this message's sender" "") "): "))) - (list (read-string prompt nil nil sender)))) + (list (read-string prompt nil nil sender) + current-prefix-arg))) + (if keep-filtering + (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 keep-filtering) + (if keep-filtering + (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) "")))