@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
@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}.
@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
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:
@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
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."
(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"))))
`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
(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"))
(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"))
"\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
["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"
"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."
+ (let ((ex
+ (lambda (h)
+ (let ((extract
+ (funcall gnus-extract-address-components
+ (or (cdr (assq 'Newsgroups (mail-header-extra h)))
+ ""))))
+ (or (car extract) (cadr extract))))))
+ (gnus-string< (funcall ex h1) (funcall ex h2))))
+
+(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
(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."
;; 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))