Mercurial > emacs
changeset 57816:af6e1f8dd9e0
(reveal-last-tick): New var.
(reveal-post-command): Use it to avoid closing overlays when we're
appending text to them.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Sun, 31 Oct 2004 22:52:54 +0000 |
parents | 3e586af3d7eb |
children | 78ec31c498b7 |
files | lisp/reveal.el |
diffstat | 1 files changed, 47 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/reveal.el Sun Oct 31 22:25:34 2004 +0000 +++ b/lisp/reveal.el Sun Oct 31 22:52:54 2004 +0000 @@ -1,6 +1,6 @@ ;;; reveal.el --- Automatically reveal hidden text at point -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. +;; Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc. ;; Author: Stefan Monnier <monnier@cs.yale.edu> ;; Keywords: outlines @@ -59,6 +59,9 @@ (defvar reveal-open-spots nil) (make-variable-buffer-local 'reveal-open-spots) +(defvar reveal-last-tick nil) +(make-variable-buffer-local 'reveal-last-tick) + ;; Actual code (defun reveal-post-command () @@ -90,16 +93,16 @@ (overlays-at (point)))) (push (cons (selected-window) ol) reveal-open-spots) (setq old-ols (delq ol old-ols)) - (let ((open (overlay-get ol 'reveal-toggle-invisible))) + (let ((open (overlay-get ol 'reveal-toggle-invisible)) inv) (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)))) + (and (setq inv (overlay-get ol 'invisible)) + (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 @@ -113,27 +116,39 @@ (setq repeat nil) (overlay-put ol 'invisible nil)))))))) ;; Close old overlays. - (dolist (ol old-ols) - (when (and (eq (current-buffer) (overlay-buffer ol)) - (not (rassq ol reveal-open-spots))) - (if (and (>= (point) (save-excursion - (goto-char (overlay-start ol)) - (line-beginning-position 1))) - (<= (point) (save-excursion - (goto-char (overlay-end ol)) - (line-beginning-position 2)))) - ;; Still near the overlay: keep it open. - (push (cons (selected-window) ol) reveal-open-spots) - ;; Really close it. - (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))))))) + (if (not (eq reveal-last-tick + (setq reveal-last-tick (buffer-modified-tick)))) + ;; The buffer was modified since last command: let's refrain from + ;; closing any overlay because it tends to behave poorly when + ;; inserting text at the end of an overlay (basically the overlay + ;; should be rear-advance when it's open, but things like + ;; outline-minor-mode make it non-rear-advance because it's + ;; a better choice when it's closed). + (dolist (ol old-ols) + (push (cons (selected-window) ol) reveal-open-spots)) + ;; The last command was only a point motion or some such + ;; non-buffer-modifying command. Let's close whatever can be closed. + (dolist (ol old-ols) + (when (and (eq (current-buffer) (overlay-buffer ol)) + (not (rassq ol reveal-open-spots))) + (if (and (>= (point) (save-excursion + (goto-char (overlay-start ol)) + (line-beginning-position 1))) + (<= (point) (save-excursion + (goto-char (overlay-end ol)) + (line-beginning-position 2)))) + ;; Still near the overlay: keep it open. + (push (cons (selected-window) ol) reveal-open-spots) + ;; Really close it. + (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 @@ -171,5 +186,5 @@ (provide 'reveal) -;;; arch-tag: 96ba0242-2274-4ed7-8e10-26bc0707b4d8 +;; arch-tag: 96ba0242-2274-4ed7-8e10-26bc0707b4d8 ;;; reveal.el ends here