notmuch/emacs
Austin Clements 8ba6016889 emacs: Eliminate buffer invisibility specs from show and wash
Previously, all visibility in show buffers for headers, message
bodies, and washed text was specified by generating one or more
symbols for each region and creating overlays with their 'invisible
property set to carefully crafted combinations of these symbols.
Visibility was controlled not by modifying the overlays directly, but
by adding and removing the generated symbols from a gigantic buffer
invisibilty spec.

This has myriad negative consequences.  It's slow because Emacs'
display engine has to traverse the buffer invisibility list for every
overlay and, since every overlay has its own symbol, this makes
rendering O(N^2) in the number of overlays.  It composes poorly
because symbol-type 'invisible properties are taken from the highest
priority overlay over a given character (which is often ambiguous!),
rather than being gathered from all overlays over a character.  As a
result, we have to include symbols related to message hiding in the
wash code lest the wash overlays un-hide parts of hidden messages.  It
also requires various workarounds for isearch to properly open
overlays, to set up buffer-invisibility-spec for
remove-from-invisibility-spec to work right, and to explicitly refresh
the display after updating the buffer invisibility spec.

None of this is necessary.

This patch converts show and wash to use simple boolean 'invisible
properties and to not use the buffer invisibility spec.  Rather than
adding and removing generated symbols from the invisibility spec, the
code now directly toggles the 'invisible property of the appropriate
overlay.  This speeds up rendering because the display engine only has
to check the boolean values of the overlays over a character.  It
composes nicely because text will be invisible if *any* overlay over
it has 'invisible t, which means we can overlap invisibility overlays
with abandon.  We no longer need any of the workarounds mentioned
above.  And it fixes a minor bug for free: now, when isearch opens a
washed region, the button text will update to say "Click/Enter to
hide" rather than remaining unchanged.
2012-12-21 09:43:45 -04:00
..
coolj.el emacs: Add more functions to clean up text/plain parts 2010-04-26 10:05:46 -07:00
Makefile fix sum moar typos [build scripts, Makefiles] 2011-06-23 15:44:59 -07:00
Makefile.local emacs: create notmuch-tag.el, and move appropriate functions from notmuch.el 2012-04-29 17:39:37 -03:00
notmuch-address.el emacs: globally replace non-branching "(if (not ..." with "(unless ..." 2012-01-21 08:17:56 -04:00
notmuch-crypto.el Spelling fix 2012-03-01 19:04:21 -04:00
notmuch-hello.el emacs: drop support for deprecated notmuch-folders 2012-12-04 09:08:02 -04:00
notmuch-lib.el emacs: Special handling for version mismatch errors 2012-12-16 17:22:14 -04:00
notmuch-logo.png emacs: Add notmuch-hello.el, a friendly frontend to notmuch 2010-04-23 12:50:18 -07:00
notmuch-maildir-fcc.el emacs: derive correct timestamp in FCC unique name 2012-06-22 07:39:21 -03:00
notmuch-message.el emacs: use new tag change helper to mark messages as replied 2012-09-19 08:03:35 -03:00
notmuch-mua.el emacs: Use --format-version for search, show, and reply 2012-12-16 17:22:26 -04:00
notmuch-print.el emacs: Put notmuch-print-mechanism in custom group notmuch-show 2012-04-24 23:25:51 -03:00
notmuch-query.el emacs: Use --format-version for search, show, and reply 2012-12-16 17:22:26 -04:00
notmuch-show.el emacs: Eliminate buffer invisibility specs from show and wash 2012-12-21 09:43:45 -04:00
notmuch-tag.el emacs: add helper for tag change list manipulation 2012-09-19 08:01:59 -03:00
notmuch-wash.el emacs: Eliminate buffer invisibility specs from show and wash 2012-12-21 09:43:45 -04:00
notmuch.el emacs: Use --format-version for search, show, and reply 2012-12-16 17:22:26 -04:00