From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Alex Bochannek Newsgroups: gmane.emacs.bugs Subject: bug#49081: 28.0.50; [PATCH] Feature suggestion, Gnus summary mode sorting for extra headers Date: Thu, 17 Jun 2021 16:53:11 -0700 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="38204"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (darwin) To: 49081@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Jun 18 01:54:12 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1lu1pr-0009mD-SU for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 18 Jun 2021 01:54:11 +0200 Original-Received: from localhost ([::1]:55688 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lu1pq-0007Ht-2H for geb-bug-gnu-emacs@m.gmane-mx.org; Thu, 17 Jun 2021 19:54:10 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:53750) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lu1pj-0007Ei-0p for bug-gnu-emacs@gnu.org; Thu, 17 Jun 2021 19:54:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:43807) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lu1pi-0000KM-Pl for bug-gnu-emacs@gnu.org; Thu, 17 Jun 2021 19:54:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lu1pi-00041z-Le for bug-gnu-emacs@gnu.org; Thu, 17 Jun 2021 19:54:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Alex Bochannek Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 17 Jun 2021 23:54:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 49081 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.162397400415448 (code B ref -1); Thu, 17 Jun 2021 23:54:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 17 Jun 2021 23:53:24 +0000 Original-Received: from localhost ([127.0.0.1]:55353 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lu1p5-000415-RY for submit@debbugs.gnu.org; Thu, 17 Jun 2021 19:53:24 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:42452) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lu1p1-00040u-3D for submit@debbugs.gnu.org; Thu, 17 Jun 2021 19:53:21 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:53584) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lu1p0-0006nN-DI for bug-gnu-emacs@gnu.org; Thu, 17 Jun 2021 19:53:18 -0400 Original-Received: from ns.lapseofthought.com ([50.0.39.240]:11596 helo=mail.lapseofthought.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lu1ox-0008EB-Uy for bug-gnu-emacs@gnu.org; Thu, 17 Jun 2021 19:53:18 -0400 Original-Received: from awb-mbp.local (unknown [IPv6:2601:646:4200:b470:dd83:77db:45db:bc2e]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.lapseofthought.com (Postfix) with ESMTPSA id 4G5f546zf0z3pdq3 for ; Thu, 17 Jun 2021 16:53:12 -0700 (PDT) Authentication-Results: ORIGINATING; auth=pass smtp.auth=alex smtp.mailfrom=alex@bochannek.com Received-SPF: pass client-ip=50.0.39.240; envelope-from=alex@bochannek.com; helo=mail.lapseofthought.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:208682 Archived-At: --=-=-= Content-Type: text/plain Hello! Since I was able to get the Newsgroups extra header working for `nnvirtual' groups, I would like to not only limit, but also sort by the extra headers. Thanks! New Gnus Summary buffer sort options for extra headers * lisp/gnus/gnus-sum.el (gnus-article-sort-functions) (gnus-thread-sort-functions, gnus-subthread-sort-functions) (gnus-summary-mode-map, gnus-summary-make-menu-bar) (gnus-article-sort-by-newsgroups) (gnus-summary-sort-by-newsgroups, gnus-summary-sort-by-extra): Sort by Newsgroups extra header. Prompt for header name for other extra headers. * doc/misc/gnus.texi (Summary Sorting): Document new sort functions * etc/NEWS: New Gnus Summary buffer sort feature --=-=-= Content-Type: text/x-patch Content-Disposition: inline diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index b63947c044..c9b5b2d9ff 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -4126,6 +4126,8 @@ Topic Variables Level. @item g Number of groups in the topic. +@item G +Number of groups in the topic and all its subtopics. @item a Number of unread articles in the topic. @item A @@ -7525,6 +7527,7 @@ Sorting the Summary Buffer @findex gnus-thread-sort-by-author @findex gnus-thread-sort-by-recipient @findex gnus-thread-sort-by-number +@findex gnus-thread-sort-by-newsgroups @findex gnus-thread-sort-by-random @vindex gnus-thread-sort-functions @findex gnus-thread-sort-by-most-recent-number @@ -7542,6 +7545,7 @@ Sorting the Summary Buffer @code{gnus-thread-sort-by-score}, @code{gnus-thread-sort-by-most-recent-number}, @code{gnus-thread-sort-by-most-recent-date}, +@code{gnus-thread-sort-by-newsgroups} and @code{gnus-thread-sort-by-random} and @code{gnus-thread-sort-by-total-score}. @@ -7603,6 +7607,7 @@ Sorting the Summary Buffer @findex gnus-article-sort-by-score @findex gnus-article-sort-by-subject @findex gnus-article-sort-by-author +@findex gnus-article-sort-by-newsgroups @findex gnus-article-sort-by-random @findex gnus-article-sort-by-number @findex gnus-article-sort-by-most-recent-number @@ -7614,8 +7619,8 @@ Sorting the Summary Buffer predicate functions are @code{gnus-article-sort-by-number}, @code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date}, -@code{gnus-article-sort-by-random}, and -@code{gnus-article-sort-by-score}. +@code{gnus-article-sort-by-newsgroups}, @code{gnus-article-sort-by-random}, +and @code{gnus-article-sort-by-score}. If you want to sort an unthreaded summary display by subject, you could say something like: @@ -10403,6 +10408,17 @@ Summary Sorting @findex gnus-summary-sort-by-score Sort by score (@code{gnus-summary-sort-by-score}). +@item C-c C-s C-u +@kindex C-c C-s C-u @r{(Summary)} +@findex gnus-summary-sort-by-newsgroups +Sort by newsgroups (@code{gnus-summary-sort-by-newsgroups}). + +@item C-c C-s C-x +@kindex C-c C-s C-x @r{(Summary)} +@findex gnus-summary-sort-by-extra +Prompts for extra header to sort by (@code{gnus-summary-sort-by-extra}). +An error will be raised if no sort functions for the header are defined. + @item C-c C-s C-r @kindex C-c C-s C-r @r{(Summary)} @findex gnus-summary-sort-by-random diff --git a/etc/NEWS b/etc/NEWS index da1372baf4..b5c1fa79ff 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -897,6 +897,12 @@ String or list of strings specifying switches for Git log under VC. ** Gnus ++++ +*** New Summary buffer sort options for extra headers. +The extra header sort option ('C-c C-s C-x') prompts for a header +and fails if no sort function has been defined. Sorting by +Newsgroups ('C-c C-s C-u') has been pre-defined. + +++ *** The '#' command in the Group and Summary buffer now toggles, instead of sets, the process mark. diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index bcd76dda29..7c5d3833f1 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -879,8 +879,9 @@ gnus-article-sort-functions Ready-made functions include `gnus-article-sort-by-number', `gnus-article-sort-by-author', `gnus-article-sort-by-subject', -`gnus-article-sort-by-date', `gnus-article-sort-by-random' -and `gnus-article-sort-by-score'. +`gnus-article-sort-by-date', `gnus-article-sort-by-score', +`gnus-article-sort-by-rsv', `gnus-article-sort-by-newsgroups', +and `gnus-article-sort-by-random'. When threading is turned on, the variable `gnus-thread-sort-functions' controls how articles are sorted." @@ -892,6 +893,7 @@ gnus-article-sort-functions (function-item gnus-article-sort-by-date) (function-item gnus-article-sort-by-score) (function-item gnus-article-sort-by-rsv) + (function-item gnus-article-sort-by-newsgroups) (function-item gnus-article-sort-by-random) (function :tag "other")) (boolean :tag "Reverse order")))) @@ -916,8 +918,8 @@ gnus-thread-sort-functions `gnus-thread-sort-by-author', `gnus-thread-sort-by-recipient' `gnus-thread-sort-by-subject', `gnus-thread-sort-by-date', `gnus-thread-sort-by-score', `gnus-thread-sort-by-most-recent-number', -`gnus-thread-sort-by-most-recent-date', `gnus-thread-sort-by-random', -and `gnus-thread-sort-by-total-score' (see +`gnus-thread-sort-by-most-recent-date', `gnus-thread-sort-by-newsgroups', +`gnus-thread-sort-by-random', and `gnus-thread-sort-by-total-score' (see `gnus-thread-score-function'). When threading is turned off, the variable @@ -938,6 +940,7 @@ gnus-thread-sort-functions (function-item gnus-thread-sort-by-rsv) (function-item gnus-thread-sort-by-most-recent-number) (function-item gnus-thread-sort-by-most-recent-date) + (function-item gnus-thread-sort-by-newsgroups) (function-item gnus-thread-sort-by-random) (function-item gnus-thread-sort-by-total-score) (function :tag "other")) @@ -961,6 +964,7 @@ gnus-subthread-sort-functions (function-item gnus-thread-sort-by-score) (function-item gnus-thread-sort-by-most-recent-number) (function-item gnus-thread-sort-by-most-recent-date) + (function-item gnus-thread-sort-by-newsgroups) (function-item gnus-thread-sort-by-random) (function-item gnus-thread-sort-by-total-score) (function :tag "other")) @@ -1976,6 +1980,8 @@ gnus-summary-mode-map "\C-c\C-s\C-i" gnus-summary-sort-by-score "\C-c\C-s\C-o" gnus-summary-sort-by-original "\C-c\C-s\C-r" gnus-summary-sort-by-random + "\C-c\C-s\C-u" gnus-summary-sort-by-newsgroups + "\C-c\C-s\C-x" gnus-summary-sort-by-extra "=" gnus-summary-expand-window "\C-x\C-s" gnus-summary-reselect-current-group "\M-g" gnus-summary-rescan-group @@ -2831,6 +2837,8 @@ gnus-summary-make-menu-bar ["Sort by lines" gnus-summary-sort-by-lines t] ["Sort by characters" gnus-summary-sort-by-chars t] ["Sort by marks" gnus-summary-sort-by-marks t] + ["Sort by newsgroup" gnus-summary-sort-by-newsgroups t] + ["Sort by extra" gnus-summary-sort-by-extra t] ["Randomize" gnus-summary-sort-by-random t] ["Original sort" gnus-summary-sort-by-original t]) ("Help" @@ -5180,6 +5188,24 @@ gnus-thread-sort-by-most-recent-date "Sort threads such that the thread with the most recently dated article comes first." (> (gnus-thread-latest-date h1) (gnus-thread-latest-date h2))) +(defun gnus-article-sort-by-newsgroups (h1 h2) + "Sort articles by newsgroups." + (gnus-string< + (let ((extract (funcall + gnus-extract-address-components + (or (cdr (assq 'Newsgroups (mail-header-extra h1))) "")))) + (or (car extract) (cadr extract))) + (let ((extract (funcall + gnus-extract-address-components + (or (cdr (assq 'Newsgroups (mail-header-extra h2))) "")))) + (or (car extract) (cadr extract))))) + +(defun gnus-thread-sort-by-newsgroups (h1 h2) + "Sort threads by root newsgroups." + (gnus-article-sort-by-newsgroups + (gnus-thread-header h1) (gnus-thread-header h2))) + + ; Since this is called not only to sort the top-level threads, but ; also in recursive sorts to order the articles within a thread, each ; article will be processed many times. Thus it speeds things up @@ -12122,6 +12148,12 @@ gnus-summary-sort-by-marks (interactive "P" gnus-summary-mode) (gnus-summary-sort 'marks reverse)) +(defun gnus-summary-sort-by-newsgroups (&optional reverse) + "Sort the summary buffer by newsgroups alphabetically. +Argument REVERSE means reverse order." + (interactive "P" gnus-summary-mode) + (gnus-summary-sort 'newsgroups reverse)) + (defun gnus-summary-sort-by-original (&optional _reverse) "Sort the summary buffer using the default sorting method. Argument REVERSE means reverse order." @@ -12133,6 +12165,24 @@ gnus-summary-sort-by-original ;; Hide subthreads if needed. (gnus-summary-maybe-hide-threads))) +(defun gnus-summary-sort-by-extra (&optional reverse) + "Sort the summary buffer using an extra header. +Argument REVERSE means reverse order." + (interactive "P" gnus-summary-mode) + (let* ((extra-header + (gnus-completing-read "Sort by extra header" + (mapcar #'symbol-name gnus-extra-headers) + t nil nil + (symbol-name + (car gnus-extra-headers)))) + (header (downcase extra-header))) + (if (and (fboundp (intern + (format "gnus-thread-sort-by-%s" header))) + (fboundp + (intern (format "gnus-article-sort-by-%s" header)))) + (gnus-summary-sort header reverse) + (error "No sort function defined for header: %s" extra-header)))) + (defun gnus-summary-sort (predicate reverse) "Sort summary buffer by PREDICATE. REVERSE means reverse order." (let* ((current (gnus-summary-article-number)) --=-=-= Content-Type: text/plain -- Alex. --=-=-=--