Mercurial > emacs
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 |
rev | line source |
---|---|
41621 | 1 ;;; reveal.el --- Automatically reveal hidden text at point |
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 | 4 ;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. |
41621 | 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 | 7 ;; Keywords: outlines |
8 | |
42320 | 9 ;; This file is part of GNU Emacs. |
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 | 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 | 15 |
45341 | 16 ;; GNU Emacs is distributed in the hope that it will be useful, |
41621 | 17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 ;; GNU General Public License for more details. | |
20 | |
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 | 23 |
24 ;;; Commentary: | |
25 | |
26 ;; Reveal mode is a minor mode that makes sure that text around point | |
27 ;; is always visible. When point enters a region of hidden text, | |
28 ;; `reveal-mode' temporarily makes it visible. | |
29 ;; | |
30 ;; This is normally used in conjunction with `outline-minor-mode', | |
31 ;; `hs-minor-mode', `hide-ifdef-mode', ... | |
32 ;; | |
33 ;; It only works with packages that hide text using overlays. | |
34 ;; Packages can provide special support for it by placing | |
35 ;; a function in the `reveal-toggle-invisible' property on the symbol | |
36 ;; used as the value of the `invisible' overlay property. | |
37 ;; The function is called right after revealing (or re-hiding) the | |
38 ;; text with two arguments: the overlay and a boolean that's non-nil | |
39 ;; if we have just revealed the text. When revealing, that function | |
40 ;; may re-hide some of the text. | |
41 | |
42 ;;; Todo: | |
43 | |
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 | 47 |
48 ;;; Code: | |
49 | |
50 (defgroup reveal nil | |
51 "Reveal hidden text on the fly." | |
52 :group 'editing) | |
53 | |
54 (defcustom reveal-around-mark t | |
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 | 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 | 62 (make-variable-buffer-local 'reveal-open-spots) |
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 | 67 ;; Actual code |
68 | |
69 (defun reveal-post-command () | |
70 ;; Refresh the spots that might have changed. | |
71 ;; `Refreshing' here means to try and re-hide the corresponding text. | |
72 ;; We don't refresh everything correctly: | |
73 ;; - we only refresh spots in the current window. | |
74 ;; FIXME: do we actually know that (current-buffer) = (window-buffer) ? | |
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 | 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 | 191 ;;;###autoload |
192 (define-minor-mode reveal-mode | |
193 "Toggle Reveal mode on or off. | |
194 Reveal mode renders invisible text around point visible again. | |
195 | |
196 Interactively, with no prefix argument, toggle the mode. | |
197 With universal prefix ARG (or if ARG is nil) turn mode on. | |
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 | 202 (if reveal-mode |
203 (progn | |
204 (set (make-local-variable 'search-invisible) t) | |
205 (add-hook 'post-command-hook 'reveal-post-command nil t)) | |
206 (kill-local-variable 'search-invisible) | |
207 (remove-hook 'post-command-hook 'reveal-post-command t))) | |
208 | |
209 ;;;###autoload | |
210 (define-minor-mode global-reveal-mode | |
211 "Toggle Reveal mode in all buffers on or off. | |
212 Reveal mode renders invisible text around point visible again. | |
213 | |
214 Interactively, with no prefix argument, toggle the mode. | |
215 With universal prefix ARG (or if ARG is nil) turn mode on. | |
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 | 218 (setq-default reveal-mode global-reveal-mode) |
219 (if global-reveal-mode | |
220 (progn | |
221 (setq search-invisible t) | |
222 (add-hook 'post-command-hook 'reveal-post-command)) | |
223 (setq search-invisible 'open) ;FIXME | |
224 (remove-hook 'post-command-hook 'reveal-post-command))) | |
225 | |
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 | 229 ;;; reveal.el ends here |