Gnus: Add option to sort threads non-recursively
authorTassilo Horn <tsdh@gnu.org>
Fri, 26 Jul 2013 22:24:33 +0000 (22:24 +0000)
committerKatsumi Yamaoka <yamaoka@jpl.org>
Fri, 26 Jul 2013 22:24:33 +0000 (22:24 +0000)
gnus-sum.el (gnus-sort-threads-recursively): New defcustom.
(gnus-sort-threads): Use it.
gnus.texi (Sorting the Summary Buffer): Document new defcustom `gnus-sort-threads-recursively'.

doc/misc/ChangeLog
doc/misc/gnus.texi
lisp/gnus/ChangeLog
lisp/gnus/gnus-sum.el

index da2491c..50214bb 100644 (file)
@@ -1,3 +1,8 @@
+2013-07-26  Tassilo Horn  <tsdh@gnu.org>
+
+       * gnus.texi (Sorting the Summary Buffer): Document new defcustom
+       `gnus-sort-threads-recursively'.
+
 2013-07-25  Glenn Morris  <rgm@gnu.org>
 
        * Makefile.in (INFO_TARGETS, DVI_TARGETS, PDF_TARGETS): Add ido.
index be0425a..5f9e0b9 100644 (file)
@@ -7394,6 +7394,11 @@ 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.
+
 @vindex gnus-thread-score-function
 The function in the @code{gnus-thread-score-function} variable (default
 @code{+}) is used for calculating the total score of a thread.  Useful
index a67c559..c32853a 100644 (file)
@@ -1,3 +1,8 @@
+2013-07-26  Tassilo Horn  <tsdh@gnu.org>
+
+       * gnus-sum.el (gnus-sort-threads-recursively): New defcustom.
+       (gnus-sort-threads): Use it.
+
 2013-07-25  Andreas Schwab  <schwab@linux-m68k.org>
 
        * gnus-art.el (gnus-button-url-regexp): Make it match url in which
index f3918b0..15cbb5a 100644 (file)
@@ -847,6 +847,13 @@ 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.
@@ -4876,9 +4883,11 @@ If LINE, insert the rebuilt thread starting on line LINE."
     (gnus-message 8 "Sorting threads...")
     (prog1
        (condition-case nil
-           (let ((max-lisp-eval-depth (max max-lisp-eval-depth 5000)))
-             (gnus-sort-threads-recursive
-              threads (gnus-make-sort-function gnus-thread-sort-functions)))
+           (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)))
          ;; 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.