annotate lisp/reveal.el @ 76022:e892213b9815

(w32_set_scroll_bar_thumb): Don't resize scroll-bar handle while dragging, except when we get close to eob. Fix position and size calculations so we don't scroll backwards just by clicking on the handle.
author Kim F. Storm <storm@cua.dk>
date Mon, 19 Feb 2007 14:45:39 +0000
parents e3694f1cb928
children 9355f9b7bbff 95d0cdf160ea
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,
75347
e3694f1cb928 Add 2007 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 70292
diff changeset
4 ;; 2005, 2006, 2007 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
45340
a0cc96a3bf71 Fix the preamble comments.
Eli Zaretskii <eliz@gnu.org>
parents: 42320
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
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
14 ;; any later version.
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
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
23 ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
24 ;; Boston, MA 02110-1301, USA.
41621
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 ;;; Commentary:
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
27
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
28 ;; 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
29 ;; is always visible. When point enters a region of hidden text,
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
30 ;; `reveal-mode' temporarily makes it visible.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
31 ;;
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
32 ;; This is normally used in conjunction with `outline-minor-mode',
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
33 ;; `hs-minor-mode', `hide-ifdef-mode', ...
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
34 ;;
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
35 ;; It only works with packages that hide text using overlays.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
36 ;; Packages can provide special support for it by placing
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
37 ;; a function in the `reveal-toggle-invisible' property on the symbol
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
38 ;; used as the value of the `invisible' overlay property.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
39 ;; The function is called right after revealing (or re-hiding) the
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
40 ;; 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
41 ;; if we have just revealed the text. When revealing, that function
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
42 ;; may re-hide some of the text.
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 ;;; Todo:
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
45
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
46 ;; - find other hysteresis features.
66744
3fbf09f9769f (reveal-post-command): Rework the handling of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64762
diff changeset
47 ;; - 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
48 ;; - 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
49
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
50 ;;; Code:
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
51
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
52 (defgroup reveal nil
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
53 "Reveal hidden text on the fly."
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
54 :group 'editing)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
55
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
56 (defcustom reveal-around-mark t
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
57 "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
58 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61275
diff changeset
59 :group 'reveal)
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
60
66744
3fbf09f9769f (reveal-post-command): Rework the handling of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64762
diff changeset
61 (defvar reveal-open-spots nil
3fbf09f9769f (reveal-post-command): Rework the handling of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64762
diff changeset
62 "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
63 Each element has the form (WINDOW . OVERLAY).")
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
64 (make-variable-buffer-local 'reveal-open-spots)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
65
57816
af6e1f8dd9e0 (reveal-last-tick): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
66 (defvar reveal-last-tick nil)
af6e1f8dd9e0 (reveal-last-tick): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
67 (make-variable-buffer-local 'reveal-last-tick)
af6e1f8dd9e0 (reveal-last-tick): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
68
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
69 ;; Actual code
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
70
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
71 (defun reveal-post-command ()
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
72 ;; Refresh the spots that might have changed.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
73 ;; `Refreshing' here means to try and re-hide the corresponding text.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
74 ;; We don't refresh everything correctly:
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
75 ;; - we only refresh spots in the current window.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
76 ;; FIXME: do we actually know that (current-buffer) = (window-buffer) ?
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
77 (with-local-quit
68108
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
78 (condition-case err
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
79 (let ((old-ols
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
80 (delq nil
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
81 (mapcar
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
82 (lambda (x)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
83 ;; 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
84 ;; 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
85 ;; 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
86 (cond
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
87 ((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
88 ((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
89 (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
90 ;; 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
91 ;; 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
92 ;; buffer any more.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
93 (setcar x (selected-window))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
94 (cdr x))))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
95 reveal-open-spots))))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
96 (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
97 (reveal-close-old-overlays old-ols))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
98 (error (message "Reveal: %s" err)))))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
99
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
100 (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
101 (let ((repeat t))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
102 (while repeat
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
103 (setq repeat nil)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
104 (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
105 (overlays-at (mark)))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
106 (overlays-at (point))))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
107 (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
108 (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
109 (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
110 (when (and inv
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
111 ;; 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
112 ;; actually invisible, and ellipsised.
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
113 (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
114 (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
115 (or (setq open
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
116 (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
117 (and (symbolp inv)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
118 (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
119 (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
120 (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
121 (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
122 (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
123 (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
124 (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
125 (if (null open)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
126 (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
127 ;; 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
128 ;; 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
129 ;; 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
130 (setq repeat t)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
131 (condition-case err
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
132 (funcall open ol nil)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
133 (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
134 open ol err)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
135 ;; 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
136 ;; 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
137 (setq repeat nil)
d47ecb3cad92 (reveal-post-command): window-buffer signals an error on
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68108
diff changeset
138 (overlay-put ol 'invisible nil))))))))))
68108
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
139 old-ols)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
140
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
141 (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
142 (if (not (eq reveal-last-tick
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
143 (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
144 ;; 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
145 ;; 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
146 ;; 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
147 ;; 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
148 ;; 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
149 ;; 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
150 nil
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
151 ;; 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
152 ;; 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
153 (dolist (ol old-ols)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
154 (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
155 (>= (point) (save-excursion
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
156 (goto-char (overlay-start ol))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
157 (line-beginning-position 1)))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
158 (<= (point) (save-excursion
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
159 (goto-char (overlay-end ol))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
160 (line-beginning-position 2)))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
161 ;; 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
162 ;; 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
163 ;; original state.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
164 (eq (current-buffer) (overlay-buffer ol)))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
165 ;; 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
166 nil
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
167 ;; Really close it.
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
168 (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
169 (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
170 (get inv 'reveal-toggle-invisible)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
171 (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
172 (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
173 open)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
174 (condition-case err
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
175 (funcall open ol t)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
176 (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
177 open ol err)))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
178 (overlay-put ol 'invisible inv))
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
179 ;; 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
180 (overlay-put ol 'reveal-invisible nil)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
181 (setq reveal-open-spots
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
182 (delq (rassoc ol reveal-open-spots)
0217588b5a1c (reveal-open-new-overlays): New extracted fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66744
diff changeset
183 reveal-open-spots)))))))
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
184
58435
180297c18beb (reveal-mode-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57816
diff changeset
185 (defvar reveal-mode-map
180297c18beb (reveal-mode-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57816
diff changeset
186 (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
187 ;; 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
188 ;; 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
189 (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
190 (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
191 map))
180297c18beb (reveal-mode-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57816
diff changeset
192
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
193 ;;;###autoload
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
194 (define-minor-mode reveal-mode
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
195 "Toggle Reveal mode on or off.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
196 Reveal mode renders invisible text around point visible again.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
197
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
198 Interactively, with no prefix argument, toggle the mode.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
199 With universal prefix ARG (or if ARG is nil) turn mode on.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
200 With zero or negative ARG turn mode off."
61275
4e273c06e466 (reveal-mode): Specify :group.
Lute Kamstra <lute@gnu.org>
parents: 61087
diff changeset
201 :group 'reveal
41778
19e76eadbf86 (reveal-mode): Fix reveal-mode's lighter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41621
diff changeset
202 :lighter (global-reveal-mode nil " Reveal")
58435
180297c18beb (reveal-mode-map): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57816
diff changeset
203 :keymap reveal-mode-map
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
204 (if reveal-mode
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
205 (progn
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
206 (set (make-local-variable 'search-invisible) t)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
207 (add-hook 'post-command-hook 'reveal-post-command nil t))
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
208 (kill-local-variable 'search-invisible)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
209 (remove-hook 'post-command-hook 'reveal-post-command t)))
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
210
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
211 ;;;###autoload
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
212 (define-minor-mode global-reveal-mode
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
213 "Toggle Reveal mode in all buffers on or off.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
214 Reveal mode renders invisible text around point visible again.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
215
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
216 Interactively, with no prefix argument, toggle the mode.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
217 With universal prefix ARG (or if ARG is nil) turn mode on.
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
218 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
219 :global t :group 'reveal
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
220 (setq-default reveal-mode global-reveal-mode)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
221 (if global-reveal-mode
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
222 (progn
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
223 (setq search-invisible t)
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
224 (add-hook 'post-command-hook 'reveal-post-command))
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
225 (setq search-invisible 'open) ;FIXME
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
226 (remove-hook 'post-command-hook 'reveal-post-command)))
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
227
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
228 (provide 'reveal)
48399
59fc5f077731 (global-reveal-mode): Add group.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 45428
diff changeset
229
57816
af6e1f8dd9e0 (reveal-last-tick): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
230 ;; arch-tag: 96ba0242-2274-4ed7-8e10-26bc0707b4d8
41621
8835d207e12a Initial commit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
231 ;;; reveal.el ends here