1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-30 04:10:54 -08:00

Gnus: Improve subthread sorting;

make subthread sorting customizable and add docs for it

* doc/misc/gnus.texi (Sorting the Summary Buffer): Document new defcustom
`gnus-subthread-sort-functions' and remove the obsolete documentation
of `gnus-sort-threads-recursively'.

* lisp/gnus/gnus-sum.el (gnus-subthread-sort-functions): New defcustom.
(gnus-sort-threads-recursively): Delete defcustom.
(gnus-sort-threads-recursive): Adapt accordingly.

* lisp/gnus/gnus-sum.el (gnus-sort-subthreads-recursive): New function.
(gnus-sort-threads-recursive): Use it.
(gnus-sort-threads): Unconditionally call `gnus-sort-threads-recursive'
again.  Now that determines how to sort subthreads.
This commit is contained in:
Tassilo Horn 2013-07-30 08:16:20 +00:00 committed by Katsumi Yamaoka
parent 1e6c60074f
commit a3fd87cb69
4 changed files with 71 additions and 18 deletions

View file

@ -1,4 +1,10 @@
2013-07-29 David Engster <deng@randomsample.de>
2013-07-30 Tassilo Horn <tsdh@gnu.org>
* gnus.texi (Sorting the Summary Buffer): Document new defcustom
`gnus-subthread-sort-functions' and remove the obsolete documentation
of `gnus-sort-threads-recursively'.
2013-07-29 David Engster <deng@randomsample.de>
* eieio.texi (top): Make clear that EIEIO is not a full CLOS
implementation.

View file

@ -7394,10 +7394,13 @@ say something like:
gnus-thread-sort-by-score))
@end lisp
By default, threads are sorted recursively, that is, first the roots,
then all subthreads, and so on. If you feel more like sorting only
the roots, so that inside a thread the original chronological order is
retained, you can set @code{gnus-sort-threads-recursively} to nil.
By default, threads including their subthreads are sorted according to
the value of @code{gnus-thread-sort-functions}. By customizing
@code{gnus-subthread-sort-functions} you can define a custom sorting
order for subthreads. This allows for example to sort threads from
high score to low score in the summary buffer, but to have subthreads
still sorted chronologically from old to new without taking their
score into account.
@vindex gnus-thread-score-function
The function in the @code{gnus-thread-score-function} variable (default

View file

@ -1,3 +1,16 @@
2013-07-30 Tassilo Horn <tsdh@gnu.org>
* gnus-sum.el (gnus-subthread-sort-functions): New defcustom.
(gnus-sort-threads-recursively): Delete defcustom.
(gnus-sort-threads-recursive): Adapt accordingly.
2013-07-30 Tassilo Horn <tsdh@gnu.org>
* gnus-sum.el (gnus-sort-subthreads-recursive): New function.
(gnus-sort-threads-recursive): Use it.
(gnus-sort-threads): Unconditionally call `gnus-sort-threads-recursive'
again. Now that determines how to sort subthreads.
2013-07-26 Tassilo Horn <tsdh@gnu.org>
* gnus-sum.el (gnus-sort-threads-recursively): New defcustom.

View file

@ -847,14 +847,6 @@ controls how articles are sorted."
(function :tag "other"))
(boolean :tag "Reverse order"))))
(defcustom gnus-sort-threads-recursively t
"If non-nil, `gnus-thread-sort-functions' are applied recursively.
Setting this to nil allows sorting high-score, recent,
etc. threads to the top of the summary buffer while still
retaining chronological old to new sorting order inside threads."
:group 'gnus-summary-sort
:type 'boolean)
(defcustom gnus-thread-sort-functions '(gnus-thread-sort-by-number)
"*List of functions used for sorting threads in the summary buffer.
By default, threads are sorted by article number.
@ -880,7 +872,11 @@ and `gnus-thread-sort-by-total-score' (see
`gnus-thread-score-function').
When threading is turned off, the variable
`gnus-article-sort-functions' controls how articles are sorted."
`gnus-article-sort-functions' controls how articles are sorted.
By default, threads and their subthreads are sorted according to
the value of this variable. To use a different sorting order for
subthreads, customize `gnus-subthread-sort-functions'."
:group 'gnus-summary-sort
:type '(repeat
(gnus-widget-reversible
@ -897,6 +893,28 @@ When threading is turned off, the variable
(function :tag "other"))
(boolean :tag "Reverse order"))))
(defcustom gnus-subthread-sort-functions 'gnus-thread-sort-functions
"*List of functions used for sorting subthreads in the summary buffer.
By default, subthreads are sorted the same as threads, i.e.,
according to the value of `gnus-thread-sort-functions'."
:group 'gnus-summary-sort
:type '(choice
(const :tag "Sort subthreads like threads" gnus-thread-sort-functions)
(repeat
(gnus-widget-reversible
(choice (function-item gnus-thread-sort-by-number)
(function-item gnus-thread-sort-by-author)
(function-item gnus-thread-sort-by-recipient)
(function-item gnus-thread-sort-by-subject)
(function-item gnus-thread-sort-by-date)
(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-random)
(function-item gnus-thread-sort-by-total-score)
(function :tag "other"))
(boolean :tag "Reverse order")))))
(defcustom gnus-thread-score-function '+
"*Function used for calculating the total score of a thread.
@ -4854,10 +4872,25 @@ If LINE, insert the rebuilt thread starting on line LINE."
(gnus-delete-line)))))))
(defun gnus-sort-threads-recursive (threads func)
;; Responsible for sorting the root articles of threads.
(let ((subthread-sort-func (if (eq gnus-subthread-sort-functions
'gnus-thread-sort-functions)
func
(gnus-make-sort-function
gnus-subthread-sort-functions))))
(sort (mapcar (lambda (thread)
(cons (car thread)
(and (cdr thread)
(gnus-sort-subthreads-recursive
(cdr thread) subthread-sort-func))))
threads) func)))
(defun gnus-sort-subthreads-recursive (threads func)
;; Responsible for sorting subthreads.
(sort (mapcar (lambda (thread)
(cons (car thread)
(and (cdr thread)
(gnus-sort-threads-recursive (cdr thread) func))))
(gnus-sort-subthreads-recursive (cdr thread) func))))
threads) func))
(defun gnus-sort-threads-loop (threads func)
@ -4885,9 +4918,7 @@ If LINE, insert the rebuilt thread starting on line LINE."
(condition-case nil
(let ((max-lisp-eval-depth (max max-lisp-eval-depth 5000))
(sort-func (gnus-make-sort-function gnus-thread-sort-functions)))
(if gnus-sort-threads-recursively
(gnus-sort-threads-recursive threads sort-func)
(sort threads sort-func)))
(gnus-sort-threads-recursive threads sort-func))
;; Even after binding max-lisp-eval-depth, the recursive
;; sorter might fail for very long threads. In that case,
;; try using a (less well-tested) non-recursive sorter.