diff --git a/README.in.rst b/README.in.rst index bf128f0..6a82dc3 100644 --- a/README.in.rst +++ b/README.in.rst @@ -17,7 +17,7 @@ :target: http://melpa-stable.milkbox.net/#/ein :alt: MELPA stable version -.. image:: screenshot.png +.. image:: screenshot.gif Install ======= @@ -72,4 +72,9 @@ From the summary buffer, ``/o`` redisplays articles already read. ``x`` undispl Gnus beginners may find the interface bewildering. In particular, groups with no unread articles do not display. Use ``L`` to bring them out of hiding. +Gnus For a New Generation +========================= +The Gnus software that the author himself uses is at https://github.com/dickmao/gnus. +His changes include non-blocking fetch, and fixing threads sorting. + .. _Getting started: http://melpa.org/#/getting-started diff --git a/README.rst b/README.rst index cd3b437..7ded972 100644 --- a/README.rst +++ b/README.rst @@ -17,7 +17,7 @@ A Gnus backend for Hacker News. :target: http://melpa-stable.milkbox.net/#/ein :alt: MELPA stable version -.. image:: screenshot.png +.. image:: screenshot.gif Install ======= @@ -72,4 +72,9 @@ From the summary buffer, ``/o`` redisplays articles already read. ``x`` undispl Gnus beginners may find the interface bewildering. In particular, groups with no unread articles do not display. Use ``L`` to bring them out of hiding. +Gnus For a New Generation +========================= +The Gnus software that the author himself uses is at https://github.com/dickmao/gnus. +His changes include non-blocking fetch, and fixing threads sorting. + .. _Getting started: http://melpa.org/#/getting-started diff --git a/nnhackernews.el b/nnhackernews.el index cacd8cc..d132a03 100644 --- a/nnhackernews.el +++ b/nnhackernews.el @@ -617,20 +617,27 @@ FORCE is generally t unless coming from `nnhackernews--score-pending'." (aif (gnus-group-name-at-point) (nnhackernews--rescore it)))) +(defun nnhackernews-extant-summary-buffer (group) + "Return main thread's summary buffer for GROUP if extant." + (let* ((args (when (and (boundp 'gnus-threaded-get-unread-articles) + gnus-threaded-get-unread-articles) + '(t))) + (name (apply #'gnus-summary-buffer-name group args))) + (gnus-buffer-live-p name))) + (defun nnhackernews--score-unread (group) "Filter unread messages for GROUP now. Otherwise *Group* buffer annoyingly overrepresents unread." (nnhackernews--with-group group - (let ((extant (get-buffer (gnus-summary-buffer-name gnus-newsgroup-name)))) - (unless extant - (nnhackernews--rescore gnus-newsgroup-name t))))) + (unless (nnhackernews-extant-summary-buffer gnus-newsgroup-name) + (nnhackernews--rescore gnus-newsgroup-name t)))) (defun nnhackernews--mark-scored-as-read (group) "If a root article (story) is scored in GROUP, that means we've already read it." (nnhackernews--with-group group (let ((preface (format "nnhackernews--mark-scored-as-read: %s not rescoring " group)) - (extant (get-buffer (gnus-summary-buffer-name gnus-newsgroup-name))) + (extant (nnhackernews-extant-summary-buffer gnus-newsgroup-name)) (unread (gnus-group-unread gnus-newsgroup-name))) (cond ((or (not (numberp unread)) (<= unread 0)) (gnus-message 7 (concat preface "(unread %s)") unread)) @@ -1460,6 +1467,10 @@ Written by John Wiegley (https://github.com/jwiegley/dot-emacs).") (fset 'gnus-user-format-function-S (symbol-function 'nnhackernews--format-time-elapsed)) +(defun nnhackernews-sort-by-number-of-articles-in-thread (t1 t2) + "Whichever of the T1 or T2 has the most articles." + (> (gnus-summary-number-of-articles-in-thread t1) + (gnus-summary-number-of-articles-in-thread t2))) (let ((custom-defaults ;; For now, revert any user overrides that I can't predict. @@ -1491,6 +1502,10 @@ Written by John Wiegley (https://github.com/jwiegley/dot-emacs).") (gnus-summary-line-format "%3t%U%R%uS %I%(%*%-10,10f %s%)\n") (gnus-auto-extend-newsgroup nil) (gnus-add-timestamp-to-message t) + (gnus-thread-sort-functions (quote (nnhackernews-sort-by-number-of-articles-in-thread))) + (gnus-summary-thread-gathering-function + (quote gnus-gather-threads-by-references)) + (gnus-subthread-sort-functions (quote (gnus-thread-sort-by-number))) (gnus-summary-display-article-function (quote ,(symbol-function 'nnhackernews--display-article))) (gnus-header-button-alist diff --git a/screencast.gif b/screencast.gif new file mode 100644 index 0000000..05452cf Binary files /dev/null and b/screencast.gif differ diff --git a/tests/nnhackernews-test.el b/tests/nnhackernews-test.el index 4c7540d..d8ed074 100644 --- a/tests/nnhackernews-test.el +++ b/tests/nnhackernews-test.el @@ -34,6 +34,13 @@ (require 'ert) (require 'message) +(mapc (lambda (key-params) + (when (string-match-p (car key-params) "nnhackernews") + (let ((params (cdr key-params))) + (setq params (assq-delete-all 'gnus-thread-sort-functions params)) + (setcdr key-params params)))) + gnus-parameters) + (defun nnhackernews-test-wait-for (predicate &optional predargs ms interval continue) "Wait until PREDICATE function returns non-`nil'. PREDARGS is argument list for the PREDICATE function.