emacs/show: introduce notmuch-show-height-limit

Analogous to notmuch-show-depth-limit, it requires a bit more
calculation, but that cost seems dominated by the rendering cost.
This commit is contained in:
David Bremner 2022-06-27 22:02:04 -03:00
parent e580ce0058
commit bde8ea5d1d
4 changed files with 151 additions and 1 deletions

View file

@ -280,6 +280,9 @@ Display of messages can be controlled by the following variables
:index:`notmuch-show-depth-limit` :index:`notmuch-show-depth-limit`
|docstring::notmuch-show-depth-limit| |docstring::notmuch-show-depth-limit|
:index:`notmuch-show-height-limit`
|docstring::notmuch-show-height-limit|
:index:`notmuch-show-max-text-part-size` :index:`notmuch-show-max-text-part-size`
|docstring::notmuch-show-max-text-part-size| |docstring::notmuch-show-max-text-part-size|

View file

@ -123,6 +123,19 @@ insertion is done."
(number :tag "Limit" 10)) (number :tag "Limit" 10))
:group 'notmuch-show) :group 'notmuch-show)
(defcustom notmuch-show-height-limit nil
"Height (from leaves) beyond which message bodies are displayed lazily.
If bound to an integer, any message with height in the message
tree greater than this will have its body displayed lazily,
initially only a button.
If this variable is set to nil (the default) no such lazy
display is done."
:type '(choice (const :tag "No limit" nil)
(number :tag "Limit" 10))
:group 'notmuch-show)
(defcustom notmuch-show-relative-dates t (defcustom notmuch-show-relative-dates t
"Display relative dates in the message summary line." "Display relative dates in the message summary line."
:type 'boolean :type 'boolean
@ -505,6 +518,18 @@ Return unchanged ADDRESS if parsing fails."
;; Otherwise format the name and address together. ;; Otherwise format the name and address together.
(concat p-name " <" p-address ">")))) (concat p-name " <" p-address ">"))))
(defun notmuch-show--mark-height (tree)
"Calculate and cache height (distance from deepest descendent)"
(let* ((msg (car tree))
(children (cadr tree))
(cached-height (plist-get msg :height)))
(or cached-height
(let ((height
(if (null children) 0
(1+ (apply #'max (mapcar #'notmuch-show--mark-height children))))))
(plist-put msg :height height)
height))))
(defun notmuch-show-insert-headerline (headers date tags depth) (defun notmuch-show-insert-headerline (headers date tags depth)
"Insert a notmuch style headerline based on HEADERS for a "Insert a notmuch style headerline based on HEADERS for a
message at DEPTH in the current thread." message at DEPTH in the current thread."
@ -1039,16 +1064,19 @@ is t, hide the part initially and show the button."
(let* ((content-type (plist-get part :content-type)) (let* ((content-type (plist-get part :content-type))
(mime-type (notmuch-show-mime-type part)) (mime-type (notmuch-show-mime-type part))
(nth (plist-get part :id)) (nth (plist-get part :id))
(height (plist-get msg :height))
(long (and (notmuch-match-content-type mime-type "text/*") (long (and (notmuch-match-content-type mime-type "text/*")
(> notmuch-show-max-text-part-size 0) (> notmuch-show-max-text-part-size 0)
(> (length (plist-get part :content)) (> (length (plist-get part :content))
notmuch-show-max-text-part-size))) notmuch-show-max-text-part-size)))
(deep (and notmuch-show-depth-limit (deep (and notmuch-show-depth-limit
(> depth notmuch-show-depth-limit))) (> depth notmuch-show-depth-limit)))
(high (and notmuch-show-height-limit
(> height notmuch-show-height-limit)))
(beg (point)) (beg (point))
;; This default header-p function omits the part button for ;; This default header-p function omits the part button for
;; the first (or only) part if this is text/plain. ;; the first (or only) part if this is text/plain.
(button (and (or deep long (button (and (or deep long high
(funcall notmuch-show-insert-header-p-function part hide)) (funcall notmuch-show-insert-header-p-function part hide))
(notmuch-show-insert-part-header (notmuch-show-insert-part-header
nth mime-type nth mime-type
@ -1058,6 +1086,7 @@ is t, hide the part initially and show the button."
;; and we have a button to allow toggling. ;; and we have a button to allow toggling.
(show-part (not (or (equal hide t) (show-part (not (or (equal hide t)
(and deep button) (and deep button)
(and high button)
(and long button)))) (and long button))))
(content-beg (point))) (content-beg (point)))
;; Store the computed mime-type for later use (e.g. by attachment handlers). ;; Store the computed mime-type for later use (e.g. by attachment handlers).
@ -1201,6 +1230,7 @@ is t, hide the part initially and show the button."
(replies (cadr tree))) (replies (cadr tree)))
;; We test whether there is a message or just some replies. ;; We test whether there is a message or just some replies.
(when msg (when msg
(notmuch-show--mark-height tree)
(notmuch-show-insert-msg msg depth)) (notmuch-show-insert-msg msg depth))
(notmuch-show-insert-thread replies (1+ depth)))) (notmuch-show-insert-thread replies (1+ depth))))

View file

@ -100,6 +100,26 @@ test_emacs '(let ((notmuch-show-depth-limit -1))
(test-visible-output))' (test-visible-output))'
test_expect_equal_file $EXPECTED/notmuch-show-depth OUTPUT test_expect_equal_file $EXPECTED/notmuch-show-depth OUTPUT
test_begin_subtest "Hide bodies of messages by height"
test_emacs '(let ((notmuch-show-height-limit -1))
(notmuch-search "thread:{id:87ocn0qh6d.fsf@yoom.home.cworth.org}")
(notmuch-test-wait)
(notmuch-search-show-thread)
(notmuch-test-wait)
(test-visible-output))'
# folding all messages by height or depth should look the same
test_expect_equal_file $EXPECTED/notmuch-show-depth OUTPUT
test_begin_subtest "Hide bodies of messages; show only leaves."
test_emacs '(let ((notmuch-show-height-limit 0))
(notmuch-search "thread:{id:87ocn0qh6d.fsf@yoom.home.cworth.org}")
(notmuch-test-wait)
(notmuch-search-show-thread)
(notmuch-test-wait)
(test-visible-output))'
test_expect_equal_file $EXPECTED/notmuch-show-height-0 OUTPUT
test_begin_subtest "Hide bodies of messages (depth > 1)" test_begin_subtest "Hide bodies of messages (depth > 1)"
test_emacs '(let ((notmuch-show-depth-limit 1)) test_emacs '(let ((notmuch-show-depth-limit 1))
(notmuch-search "thread:{id:87ocn0qh6d.fsf@yoom.home.cworth.org}") (notmuch-search "thread:{id:87ocn0qh6d.fsf@yoom.home.cworth.org}")

View file

@ -0,0 +1,97 @@
Lars Kellogg-Stedman <lars@seas.harvard.edu> (2009-11-17) (inbox signed)
Subject: [notmuch] Working with Maildir storage?
To: notmuch@notmuchmail.org
Date: Tue, 17 Nov 2009 14:00:54 -0500
[ multipart/mixed (hidden) ]
Mikhail Gusarov <dottedmag@dottedmag.net> (2009-11-17) (inbox signed unread)
Subject: Re: [notmuch] Working with Maildir storage?
To: notmuch@notmuchmail.org
Date: Wed, 18 Nov 2009 01:02:38 +0600
[ multipart/mixed (hidden) ]
Lars Kellogg-Stedman <lars@seas.harvard.edu> (2009-11-17) (inbox signed)
Subject: Re: [notmuch] Working with Maildir storage?
To: Mikhail Gusarov <dottedmag@dottedmag.net>
Cc: notmuch@notmuchmail.org
Date: Tue, 17 Nov 2009 15:33:01 -0500
[ multipart/mixed (hidden) ]
Mikhail Gusarov <dottedmag@dottedmag.net> (2009-11-17) (inbox unread)
Subject: [notmuch] Working with Maildir storage?
To: notmuch@notmuchmail.org
Date: Wed, 18 Nov 2009 02:50:48 +0600
Twas brillig at 15:33:01 17.11.2009 UTC-05 when lars at seas.harvard.edu
did gyre and gimble:
LK> Is the list archived anywhere? The obvious archives
LK> (http://notmuchmail.org/pipermail/notmuch/) aren't available, and I
LK> think I subscribed too late to get the patch (I only just saw the
LK> discussion about it).
LK> It doesn't look like the patch is in git yet.
Just has been pushed
[ 10-line signature. Click/Enter to show. ]
Keith Packard <keithp@keithp.com> (2009-11-17) (inbox unread)
Subject: [notmuch] Working with Maildir storage?
To: notmuch@notmuchmail.org
Date: Tue, 17 Nov 2009 13:24:13 -0800
[ text/plain (hidden) ]
Lars Kellogg-Stedman <lars@seas.harvard.edu> (2009-11-18) (inbox signed unread)
Subject: Re: [notmuch] Working with Maildir storage?
To: Keith Packard <keithp@keithp.com>
Cc: notmuch@notmuchmail.org
Date: Tue, 17 Nov 2009 19:50:40 -0500
[ multipart/mixed ]
[ multipart/signed ]
[ Unknown key ID 0xD74695063141ACD8 or unsupported algorithm ]
[ text/plain ]
> I've also pushed a slightly more complicated (and complete) fix to my
> private notmuch repository
The version of lib/messages.cc in your repo doesn't build because it's
missing "#include <stdint.h>" (for the uint32_t on line 466).
[ 4-line signature. Click/Enter to show. ]
[ application/pgp-signature ]
[ text/plain ]
[ 4-line signature. Click/Enter to show. ]
Carl Worth <cworth@cworth.org> (2009-11-18) (inbox unread)
Subject: [notmuch] Working with Maildir storage?
To: notmuch@notmuchmail.org
Date: Wed, 18 Nov 2009 02:08:10 -0800
On Tue, 17 Nov 2009 14:00:54 -0500, Lars Kellogg-Stedman <lars at
seas.harvard.edu> wrote:
> I saw the LWN article and decided to take a look at notmuch. I'm
> currently using mutt and mairix to index and read a collection of
> Maildir mail folders (around 40,000 messages total).
Welcome, Lars!
I hadn't even seen that Keith's blog post had been picked up by lwn.net.
That's very interesting. So, thanks for coming and trying out notmuch.
> Error opening
> /home/lars/Mail/read-messages.2008/cur/1246413773.24928_27334.hostname,U=3026:2,S:
> Too many open files
Sadly, the lwn article coincided with me having just introduced this
bug, and then getting on a Trans-Atlantic flight. So I fixed the bug
fairly quickly, but there was quite a bit of latency before I could push
the fix out. It should be fixed now.
> I'm curious if this is expected behavior (i.e., notmuch does not work
> with Maildir) or if something else is going on.
Notmuch works just fine with maildir---it's one of the things that it
likes the best.
Happy hacking,
-Carl