(forward-word): Allow 0 args.
[bpt/emacs.git] / lisp / reveal.el
index 9b6ba28..2809db2 100644 (file)
@@ -5,12 +5,14 @@
 ;; Author: Stefan Monnier <monnier@cs.yale.edu>
 ;; Keywords: outlines
 
-;; This file is free software; you can redistribute it and/or modify
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; the Free Software Foundation; either version 2, or (at your option)
 ;; any later version.
 
-;; This file is distributed in the hope that it will be useful,
+;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;; GNU General Public License for more details.
@@ -66,6 +68,7 @@
   ;; - we only refresh spots in the current window.
   ;; FIXME: do we actually know that (current-buffer) = (window-buffer) ?
   (with-local-quit
+  (condition-case err
    (let* ((spots (cvs-partition
                  (lambda (x)
                    ;; We refresh any spot in the current window as well
                                 (current-buffer)))))
                  reveal-open-spots))
          (old-ols (mapcar 'cdr (car spots)))
-         (repeat t)
-         ;; `post-command-hook' binds it to t, but the user might want to
-         ;; interrupt our work if we somehow get stuck in an infinite loop.
-         (inhibit-quit nil)
-         inv open)
+         (repeat t))
      (setq reveal-open-spots (cdr spots))
      ;; Open new overlays.
      (while repeat
                          (overlays-at (point))))
         (push (cons (selected-window) ol) reveal-open-spots)
         (setq old-ols (delq ol old-ols))
-        (when (setq inv (overlay-get ol 'invisible))
-          (when (or (overlay-get ol 'isearch-open-invisible)
-                    (and (consp buffer-invisibility-spec)
-                         (assq inv buffer-invisibility-spec)))
-            (overlay-put ol 'reveal-invisible inv)
-            (overlay-put ol 'invisible nil)
-            (when (setq open (get inv 'reveal-toggle-invisible))
+        (let ((open (overlay-get ol 'reveal-toggle-invisible)))
+          (when (or open
+                    (let ((inv (overlay-get ol 'invisible)))
+                      (and inv (symbolp inv)
+                           (or (setq open (or (get inv 'reveal-toggle-invisible)
+                                              (overlay-get ol 'isearch-open-invisible-temporary)))
+                               (overlay-get ol 'isearch-open-invisible)
+                               (and (consp buffer-invisibility-spec)
+                                    (assq inv buffer-invisibility-spec)))
+                           (overlay-put ol 'reveal-invisible inv))))
+            (if (null open)
+                (overlay-put ol 'invisible nil)
               ;; Use the provided opening function and repeat (since the
               ;; opening function might have hidden a subpart around point).
               (setq repeat t)
               (condition-case err
-                  (funcall open ol t)
-                (error (message "!!Reveal-show: %s !!" err))))))))
+                  (funcall open ol nil)
+                (error (message "!!Reveal-show: %s !!" err)
+                       ;; Let's default to a meaningful behavior to avoid
+                       ;; getting stuck in an infinite loop.
+                       (setq repeat nil)
+                       (overlay-put ol 'invisible nil))))))))
      ;; Close old overlays.
      (dolist (ol old-ols)
-       (when (and (setq inv (overlay-get ol 'reveal-invisible))
-                 (eq (current-buffer) (overlay-buffer ol))
+       (when (and (eq (current-buffer) (overlay-buffer ol))
                  (not (rassq ol reveal-open-spots)))
         (if (and (>= (point) (save-excursion
                                (goto-char (overlay-start ol))
             ;; Still near the overlay: keep it open.
             (push (cons (selected-window) ol) reveal-open-spots)
           ;; Really close it.
-          (overlay-put ol 'invisible inv)
-          (when (setq open (get inv 'reveal-toggle-invisible))
-            (condition-case err
-                (funcall open ol nil)
-              (error (message "!!Reveal-hide: %s !!" err))))))))))
+          (let ((open (overlay-get ol 'reveal-toggle-invisible)) inv)
+            (if (or open
+                    (and (setq inv (overlay-get ol 'reveal-invisible))
+                         (setq open (or (get inv 'reveal-toggle-invisible)
+                                        (overlay-get ol 'isearch-open-invisible-temporary)))))
+                (condition-case err
+                    (funcall open ol t)
+                  (error (message "!!Reveal-hide: %s !!" err)))
+              (overlay-put ol 'invisible inv)))))))
+   (error (message "Reveal: %s" err)))))
 
 ;;;###autoload
 (define-minor-mode reveal-mode
@@ -148,7 +160,7 @@ Reveal mode renders invisible text around point visible again.
 Interactively, with no prefix argument, toggle the mode.
 With universal prefix ARG (or if ARG is nil) turn mode on.
 With zero or negative ARG turn mode off."
-  :global t
+  :global t :group 'reveal
   (setq-default reveal-mode global-reveal-mode)
   (if global-reveal-mode
       (progn
@@ -158,4 +170,6 @@ With zero or negative ARG turn mode off."
     (remove-hook 'post-command-hook 'reveal-post-command)))
 
 (provide 'reveal)
+
+;;; arch-tag: 96ba0242-2274-4ed7-8e10-26bc0707b4d8
 ;;; reveal.el ends here