annotate lisp/reveal.el @ 98182:19ec1646fe6c

The Rmail/mbox merge has been abandoned in favor of a restart using the current rmail.el file. A comprehensive list of changes will be supplied when pmail.el is morphed back into rmail.el The current status is that pmail.el supports basic Rmail navigation (no summary support) and shows the current message in a special buffer using buffer-swap-text. No decoding is done yet. That is the next step.
author Paul Reilly <pmr@pajato.com>
date Mon, 15 Sep 2008 20:56:53 +0000
parents ee5932bf781d
children a9dc0e7c3f2b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1 ;;; reveal.el --- Automatically reveal hidden text at point
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
2
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64091
diff changeset
3 ;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
79721
73661ddc7ac7 Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78236
diff changeset
4 ;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
5
70292
2b77fa42947f Update my email address.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68138
diff changeset
6 ;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
7 ;; Keywords: outlines
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
8
42320
44b4a14ae7fc Fix Lisp headers.
Pavel Janík <Pavel@Janik.cz>
parents: 41778
diff changeset
9 ;; This file is part of GNU Emacs.
44b4a14ae7fc Fix Lisp headers.
Pavel Janík <Pavel@Janik.cz>
parents: 41778
diff changeset
10
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79721
diff changeset
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79721
diff changeset
13 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79721
diff changeset
14 ;; (at your option) any later version.
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
15
45341
1471d94c6f8a More preamble fixes.
Eli Zaretskii <eliz@gnu.org>
parents: 45340
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
19 ;; GNU General Public License for more details.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
20
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79721
diff changeset
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
23
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
24 ;;; Commentary:
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
25
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
26 ;; Reveal mode is a minor mode that makes sure that text around point
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
27 ;; is always visible. When point enters a region of hidden text,
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
28 ;; `reveal-mode' temporarily makes it visible.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
29 ;;
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
30 ;; This is normally used in conjunction with `outline-minor-mode',
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
31 ;; `hs-minor-mode', `hide-ifdef-mode', ...
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
32 ;;
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
33 ;; It only works with packages that hide text using overlays.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
34 ;; Packages can provide special support for it by placing
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
35 ;; a function in the `reveal-toggle-invisible' property on the symbol
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
36 ;; used as the value of the `invisible' overlay property.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
37 ;; The function is called right after revealing (or re-hiding) the
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
38 ;; text with two arguments: the overlay and a boolean that's non-nil
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
39 ;; if we have just revealed the text. When revealing, that function
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
40 ;; may re-hide some of the text.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
41
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
42 ;;; Todo:
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
43
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
44 ;; - find other hysteresis features.
66744
3fbf09f9769f (reveal-post-command): Rework the handling of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64762
diff changeset
45 ;; - don't hide after a scroll command
3fbf09f9769f (reveal-post-command): Rework the handling of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64762
diff changeset
46 ;; - delay hiding by a couple seconds (i.e. hide in the background)
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
47
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
48 ;;; Code:
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
49
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
50 (defgroup reveal nil
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
51 "Reveal hidden text on the fly."
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
52 :group 'editing)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
53
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
54 (defcustom reveal-around-mark t
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
55 "Reveal text around the mark, if active."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61275
diff changeset
56 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61275
diff changeset
57 :group 'reveal)
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
58
66744
3fbf09f9769f (reveal-post-command): Rework the handling of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64762
diff changeset
59 (defvar reveal-open-spots nil
3fbf09f9769f (reveal-post-command): Rework the handling of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64762
diff changeset
60 "List of spots in the buffer which are open.
3fbf09f9769f (reveal-post-command): Rework the handling of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64762
diff changeset
61 Each element has the form (WINDOW . OVERLAY).")
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
62 (make-variable-buffer-local 'reveal-open-spots)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
63
57816
af6e1f8dd9e0 (reveal-last-tick): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
64 (defvar reveal-last-tick nil)
af6e1f8dd9e0 (reveal-last-tick): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
65 (make-variable-buffer-local 'reveal-last-tick)
af6e1f8dd9e0 (reveal-last-tick): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
66
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
67 ;; Actual code
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
68
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
69 (defun reveal-post-command ()
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
70 ;; Refresh the spots that might have changed.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
71 ;; `Refreshing' here means to try and re-hide the corresponding text.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
72 ;; We don't refresh everything correctly:
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
73 ;; - we only refresh spots in the current window.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
74 ;; FIXME: do we actually know that (current-buffer) = (window-buffer) ?
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
75 (with-local-quit
68108
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
76 (condition-case err
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
77 (let ((old-ols
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
78 (delq nil
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
79 (mapcar
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
80 (lambda (x)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
81 ;; We refresh any spot in the current window as well
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
82 ;; as any spots associated with a dead window or
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
83 ;; a window which does not show this buffer any more.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
84 (cond
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
85 ((eq (car x) (selected-window)) (cdr x))
68138
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
86 ((not (and (window-live-p (car x))
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
87 (eq (window-buffer (car x)) (current-buffer))))
68108
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
88 ;; Adopt this since it's owned by a window that's
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
89 ;; either not live or at least not showing this
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
90 ;; buffer any more.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
91 (setcar x (selected-window))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
92 (cdr x))))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
93 reveal-open-spots))))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
94 (setq old-ols (reveal-open-new-overlays old-ols))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
95 (reveal-close-old-overlays old-ols))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
96 (error (message "Reveal: %s" err)))))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
97
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
98 (defun reveal-open-new-overlays (old-ols)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
99 (let ((repeat t))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
100 (while repeat
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
101 (setq repeat nil)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
102 (dolist (ol (nconc (when (and reveal-around-mark mark-active)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
103 (overlays-at (mark)))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
104 (overlays-at (point))))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
105 (setq old-ols (delq ol old-ols))
68138
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
106 (when (overlay-start ol) ;Check it's still live.
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
107 (let ((inv (overlay-get ol 'invisible)) open)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
108 (when (and inv
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
109 ;; There's an `invisible' property. Make sure it's
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
110 ;; actually invisible, and ellipsised.
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
111 (and (consp buffer-invisibility-spec)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
112 (cdr (assq inv buffer-invisibility-spec)))
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
113 (or (setq open
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
114 (or (overlay-get ol 'reveal-toggle-invisible)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
115 (and (symbolp inv)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
116 (get inv 'reveal-toggle-invisible))
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
117 (overlay-get ol 'isearch-open-invisible-temporary)))
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
118 (overlay-get ol 'isearch-open-invisible)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
119 (and (consp buffer-invisibility-spec)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
120 (cdr (assq inv buffer-invisibility-spec))))
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
121 (overlay-put ol 'reveal-invisible inv))
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
122 (push (cons (selected-window) ol) reveal-open-spots)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
123 (if (null open)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
124 (overlay-put ol 'invisible nil)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
125 ;; Use the provided opening function and repeat (since the
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
126 ;; opening function might have hidden a subpart around point
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
127 ;; or moved/killed some of the overlays).
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
128 (setq repeat t)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
129 (condition-case err
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
130 (funcall open ol nil)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
131 (error (message "!!Reveal-show (funcall %s %s nil): %s !!"
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
132 open ol err)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
133 ;; Let's default to a meaningful behavior to avoid
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
134 ;; getting stuck in an infinite loop.
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
135 (setq repeat nil)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
136 (overlay-put ol 'invisible nil))))))))))
68108
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
137 old-ols)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
138
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
139 (defun reveal-close-old-overlays (old-ols)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
140 (if (not (eq reveal-last-tick
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
141 (setq reveal-last-tick (buffer-modified-tick))))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
142 ;; The buffer was modified since last command: let's refrain from
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
143 ;; closing any overlay because it tends to behave poorly when
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
144 ;; inserting text at the end of an overlay (basically the overlay
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
145 ;; should be rear-advance when it's open, but things like
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
146 ;; outline-minor-mode make it non-rear-advance because it's
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
147 ;; a better choice when it's closed).
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
148 nil
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
149 ;; The last command was only a point motion or some such
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
150 ;; non-buffer-modifying command. Let's close whatever can be closed.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
151 (dolist (ol old-ols)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
152 (if (and (overlay-start ol) ;Check it's still live.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
153 (>= (point) (save-excursion
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
154 (goto-char (overlay-start ol))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
155 (line-beginning-position 1)))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
156 (<= (point) (save-excursion
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
157 (goto-char (overlay-end ol))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
158 (line-beginning-position 2)))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
159 ;; If the application has moved the overlay to some other
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
160 ;; buffer, we'd better reset the buffer to its
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
161 ;; original state.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
162 (eq (current-buffer) (overlay-buffer ol)))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
163 ;; Still near the overlay: keep it open.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
164 nil
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
165 ;; Really close it.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
166 (let* ((inv (overlay-get ol 'reveal-invisible))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
167 (open (or (overlay-get ol 'reveal-toggle-invisible)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
168 (get inv 'reveal-toggle-invisible)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
169 (overlay-get ol 'isearch-open-invisible-temporary))))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
170 (if (and (overlay-start ol) ;Check it's still live.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
171 open)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
172 (condition-case err
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
173 (funcall open ol t)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
174 (error (message "!!Reveal-hide (funcall %s %s t): %s !!"
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
175 open ol err)))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
176 (overlay-put ol 'invisible inv))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
177 ;; Remove the overlay from the list of open spots.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
178 (overlay-put ol 'reveal-invisible nil)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
179 (setq reveal-open-spots
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
180 (delq (rassoc ol reveal-open-spots)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
181 reveal-open-spots)))))))
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
182
58435
180297c18beb (reveal-mode-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57816
diff changeset
183 (defvar reveal-mode-map
180297c18beb (reveal-mode-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57816
diff changeset
184 (let ((map (make-sparse-keymap)))
60487
bf372b4b92e9 (reveal-mode-map): Bind C-a to beginning-of-line.
Kim F. Storm <storm@cua.dk>
parents: 60301
diff changeset
185 ;; Override the default move-beginning-of-line and move-end-of-line
bf372b4b92e9 (reveal-mode-map): Bind C-a to beginning-of-line.
Kim F. Storm <storm@cua.dk>
parents: 60301
diff changeset
186 ;; which skips valuable invisible text.
61087
386a445c2ae9 (reveal-mode-map): Don't override C-a and C-e.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60487
diff changeset
187 (define-key map [remap move-beginning-of-line] 'beginning-of-line)
386a445c2ae9 (reveal-mode-map): Don't override C-a and C-e.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60487
diff changeset
188 (define-key map [remap move-end-of-line] 'end-of-line)
58435
180297c18beb (reveal-mode-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57816
diff changeset
189 map))
180297c18beb (reveal-mode-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57816
diff changeset
190
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
191 ;;;###autoload
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
192 (define-minor-mode reveal-mode
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
193 "Toggle Reveal mode on or off.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
194 Reveal mode renders invisible text around point visible again.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
195
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
196 Interactively, with no prefix argument, toggle the mode.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
197 With universal prefix ARG (or if ARG is nil) turn mode on.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
198 With zero or negative ARG turn mode off."
61275
4e273c06e466 (reveal-mode): Specify :group.
Lute Kamstra <lute@gnu.org>
parents: 61087
diff changeset
199 :group 'reveal
41778
19e76eadbf86 (reveal-mode): Fix reveal-mode's lighter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41621
diff changeset
200 :lighter (global-reveal-mode nil " Reveal")
58435
180297c18beb (reveal-mode-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57816
diff changeset
201 :keymap reveal-mode-map
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
202 (if reveal-mode
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
203 (progn
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
204 (set (make-local-variable 'search-invisible) t)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
205 (add-hook 'post-command-hook 'reveal-post-command nil t))
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
206 (kill-local-variable 'search-invisible)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
207 (remove-hook 'post-command-hook 'reveal-post-command t)))
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
208
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
209 ;;;###autoload
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
210 (define-minor-mode global-reveal-mode
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
211 "Toggle Reveal mode in all buffers on or off.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
212 Reveal mode renders invisible text around point visible again.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
213
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
214 Interactively, with no prefix argument, toggle the mode.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
215 With universal prefix ARG (or if ARG is nil) turn mode on.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
216 With zero or negative ARG turn mode off."
48399
59fc5f077731 (global-reveal-mode): Add group.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 45428
diff changeset
217 :global t :group 'reveal
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
218 (setq-default reveal-mode global-reveal-mode)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
219 (if global-reveal-mode
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
220 (progn
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
221 (setq search-invisible t)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
222 (add-hook 'post-command-hook 'reveal-post-command))
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
223 (setq search-invisible 'open) ;FIXME
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
224 (remove-hook 'post-command-hook 'reveal-post-command)))
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
225
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
226 (provide 'reveal)
48399
59fc5f077731 (global-reveal-mode): Add group.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 45428
diff changeset
227
57816
af6e1f8dd9e0 (reveal-last-tick): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
228 ;; arch-tag: 96ba0242-2274-4ed7-8e10-26bc0707b4d8
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
229 ;;; reveal.el ends here