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:
parent
1e6c60074f
commit
a3fd87cb69
4 changed files with 71 additions and 18 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue