changeset 75088:bd256d0d5e8e

(momentary): New face. (momentary-string-display): Display the string via a temporary overlay using the new face, instead of inserting it in the buffer.
author Richard M. Stallman <rms@gnu.org>
date Thu, 04 Jan 2007 21:46:06 +0000
parents 420404d9fc69
children 808654e7c05a
files lisp/subr.el
diffstat 1 files changed, 19 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/subr.el	Thu Jan 04 21:26:43 2007 +0000
+++ b/lisp/subr.el	Thu Jan 04 21:46:06 2007 +0000
@@ -1884,6 +1884,11 @@
   (if all (save-excursion (set-buffer (other-buffer))))
   (set-buffer-modified-p (buffer-modified-p)))
 
+(defface momentary
+  '((t (:inherit mode-line)))
+  "Face for momentarily displaying text in the current buffer."
+  :group 'display)
+
 (defun momentary-string-display (string pos &optional exit-char message)
   "Momentarily display STRING in the buffer at POS.
 Display remains until next event is input.
@@ -1895,32 +1900,21 @@
 Display MESSAGE (optional fourth arg) in the echo area.
 If MESSAGE is nil, instructions to type EXIT-CHAR are displayed there."
   (or exit-char (setq exit-char ?\s))
-  (let ((inhibit-read-only t)
-	;; Don't modify the undo list at all.
-	(buffer-undo-list t)
-	(modified (buffer-modified-p))
-	(name buffer-file-name)
-	insert-end)
+  (let ((momentary-overlay (make-overlay pos pos nil t)))
+    (overlay-put momentary-overlay 'before-string
+		 (propertize string 'face 'momentary))
     (unwind-protect
 	(progn
-	  (save-excursion
-	    (goto-char pos)
-	    ;; To avoid trouble with out-of-bounds position
-	    (setq pos (point))
-	    ;; defeat file locking... don't try this at home, kids!
-	    (setq buffer-file-name nil)
-	    (insert-before-markers string)
-	    (setq insert-end (point))
-	    ;; If the message end is off screen, recenter now.
-	    (if (< (window-end nil t) insert-end)
-		(recenter (/ (window-height) 2)))
-	    ;; If that pushed message start off the screen,
-	    ;; scroll to start it at the top of the screen.
-	    (move-to-window-line 0)
-	    (if (> (point) pos)
-		(progn
-		  (goto-char pos)
-		  (recenter 0))))
+	  ;; If the message end is off screen, recenter now.
+	  (if (< (window-end nil t) (+ pos (length string)))
+	      (recenter (/ (window-height) 2)))
+	  ;; If that pushed message start off the screen,
+	  ;; scroll to start it at the top of the screen.
+	  (move-to-window-line 0)
+	  (if (> (point) pos)
+	      (progn
+		(goto-char pos)
+		(recenter 0)))
 	  (message (or message "Type %s to continue editing.")
 		   (single-key-description exit-char))
 	  (let (char)
@@ -1940,11 +1934,7 @@
 	      (or (eq char exit-char)
 		  (eq char (event-convert-list exit-char))
 		  (setq unread-command-events (list char))))))
-      (if insert-end
-	  (save-excursion
-	    (delete-region pos insert-end)))
-      (setq buffer-file-name name)
-      (set-buffer-modified-p modified))))
+      (delete-overlay momentary-overlay))))
 
 
 ;;;; Overlay operations