]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow reveal.el to toggle `display' properties
authorLars Ingebrigtsen <larsi@gnus.org>
Sat, 21 Sep 2019 10:00:12 +0000 (12:00 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sat, 21 Sep 2019 10:04:00 +0000 (12:04 +0200)
* lisp/reveal.el (reveal-open-new-overlays): Allow also toggling
`displa' overlay properties (bug#28785).

etc/NEWS
lisp/reveal.el

index e8d3dffd3bdc5c6743acc7bf672d6e7178afcff7..02fe93a782d1bff8b04d05eac97e3b19f18200a0 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2130,6 +2130,11 @@ valid event type.
 \f
 * Lisp Changes in Emacs 27.1
 
+** 'reveal-mode' can now also be used for more than to toggle between
+invisible and visible: It can also toggle 'display' properties in
+overlays.  This is only done on 'display' properties that have the
+'reveal-toggle-invisible' property set.
+
 +++
 ** 'process-contact' now takes an optional NO-BLOCK parameter to allow
 not waiting for a process to be set up.
index 67740c8149bb36b4529453954aab23b16c8698f1..5483073474eb422ba1920a43ef65020701ac265e 100644 (file)
 ;; is always visible.  When point enters a region of hidden text,
 ;; `reveal-mode' temporarily makes it visible.
 ;;
+;; Overlays can also use the `display' property.  For them to be
+;; revealed, the `reveal-toggle-invisible' property also has to be
+;; present, and should be a function to toggle between having a
+;; display property and not.
+;;
 ;; This is normally used in conjunction with `outline-minor-mode',
 ;; `hs-minor-mode', `hide-ifdef-mode', ...
 ;;
@@ -103,21 +108,32 @@ Each element has the form (WINDOW . OVERLAY).")
                          (overlays-at (point))))
         (setq old-ols (delq ol old-ols))
         (when (overlay-start ol)        ;Check it's still live.
-          (let ((inv (overlay-get ol 'invisible)) open)
-            (when (and inv
-                       ;; There's an `invisible' property.  Make sure it's
-                       ;; actually invisible, and ellipsized.
-                       (and (consp buffer-invisibility-spec)
-                            (cdr (assq inv buffer-invisibility-spec)))
+          ;; We either have an invisible overlay, or a display
+          ;; overlay.  Always reveal invisible text, but only reveal
+          ;; display properties if `reveal-toggle-invisible' is
+          ;; present.
+          (let ((inv (overlay-get ol 'invisible))
+                (disp (and (overlay-get ol 'display)
+                           (overlay-get ol 'reveal-toggle-invisible)))
+                open)
+            (when (and (or (and inv
+                                ;; There's an `invisible' property.
+                                ;; Make sure it's actually invisible,
+                                ;; and ellipsized.
+                                (and (consp buffer-invisibility-spec)
+                                     (cdr (assq inv buffer-invisibility-spec))))
+                           disp)
                        (or (setq open
                                  (or (overlay-get ol 'reveal-toggle-invisible)
                                      (and (symbolp inv)
                                           (get inv 'reveal-toggle-invisible))
-                                     (overlay-get ol 'isearch-open-invisible-temporary)))
+                                     (overlay-get
+                                      ol 'isearch-open-invisible-temporary)))
                            (overlay-get ol 'isearch-open-invisible)
                            (and (consp buffer-invisibility-spec)
-                                (cdr (assq inv buffer-invisibility-spec))))
-                       (overlay-put ol 'reveal-invisible inv))
+                                (cdr (assq inv buffer-invisibility-spec)))))
+              (when inv
+                (overlay-put ol 'reveal-invisible inv))
               (push (cons (selected-window) ol) reveal-open-spots)
               (if (null open)
                   (overlay-put ol 'invisible nil)