changeset 95899:d5d7186027e2

* progmodes/compile.el (compilation-start): Don't disable undo in comint buffer. Don't override the comint-filter with our own. (compilation-filter): Change point's insertion-type. * comint.el (comint-output-filter): Use copy-marker.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 13 Jun 2008 16:22:16 +0000
parents 22320e063151
children 99342636fa96
files lisp/ChangeLog lisp/comint.el lisp/progmodes/compile.el
diffstat 3 files changed, 32 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Fri Jun 13 15:15:32 2008 +0000
+++ b/lisp/ChangeLog	Fri Jun 13 16:22:16 2008 +0000
@@ -1,3 +1,11 @@
+2008-06-13  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* progmodes/compile.el (compilation-start): Don't disable undo in
+	comint buffer.  Don't override the comint-filter with our own.
+	(compilation-filter): Change point's insertion-type.
+
+	* comint.el (comint-output-filter): Use copy-marker.
+
 2008-06-13  David Reitter  <david.reitter@gmail.com>
 
 	* textmodes/flyspell.el (mail-mode-flyspell-verify):
--- a/lisp/comint.el	Fri Jun 13 15:15:32 2008 +0000
+++ b/lisp/comint.el	Fri Jun 13 16:22:16 2008 +0000
@@ -1740,12 +1740,8 @@
 
 	;; Insert STRING
 	(let ((inhibit-read-only t)
-	      ;; Avoid the overhead of save-excursion, since we just
-	      ;; fiddle with the point
-	      (saved-point (point-marker)))
-
-	  ;; The point should float after any insertion we do
-	  (set-marker-insertion-type saved-point t)
+              ;; The point should float after any insertion we do.
+	      (saved-point (copy-marker (point) t)))
 
 	  ;; We temporarly remove any buffer narrowing, in case the
 	  ;; process mark is outside of the restriction
--- a/lisp/progmodes/compile.el	Fri Jun 13 15:15:32 2008 +0000
+++ b/lisp/progmodes/compile.el	Fri Jun 13 16:22:16 2008 +0000
@@ -1159,7 +1159,6 @@
 		  (error nil))
 	      (error "Cannot have two processes in `%s' at once"
 		     (buffer-name)))))
-      (buffer-disable-undo (current-buffer))
       ;; first transfer directory from where M-x compile was called
       (setq default-directory thisdir)
       ;; Make compilation buffer read-only.  The filter can still write it.
@@ -1177,7 +1176,9 @@
 	(erase-buffer)
 	;; Select the desired mode.
 	(if (not (eq mode t))
-	    (funcall mode)
+            (progn
+              (buffer-disable-undo)
+              (funcall mode))
 	  (setq buffer-read-only nil)
 	  (with-no-warnings (comint-mode))
 	  (compilation-shell-minor-mode))
@@ -1262,7 +1263,10 @@
 	  (setq mode-line-process
 		(list (propertize ":%s" 'face 'compilation-warning)))
 	  (set-process-sentinel proc 'compilation-sentinel)
-	  (set-process-filter proc 'compilation-filter)
+          (unless (eq mode t)
+            ;; Keep the comint filter, since it's needed for proper handling
+            ;; of the prompts.
+            (set-process-filter proc 'compilation-filter))
 	  ;; Use (point-max) here so that output comes in
 	  ;; after the initial text,
 	  ;; regardless of where the user sees point.
@@ -1666,17 +1670,21 @@
 (defun compilation-filter (proc string)
   "Process filter for compilation buffers.
 Just inserts the text, and runs `compilation-filter-hook'."
-  (if (buffer-live-p (process-buffer proc))
-      (with-current-buffer (process-buffer proc)
-	(let ((inhibit-read-only t))
-	  (save-excursion
-	    (goto-char (process-mark proc))
-            ;; We used to use `insert-before-markers', so that windows with
-            ;; point at `process-mark' scroll along with the output, but we
-            ;; now use window-point-insertion-type instead.
-	    (insert string)
-            (set-marker (process-mark proc) (point))
-	    (run-hooks 'compilation-filter-hook))))))
+  (when (buffer-live-p (process-buffer proc))
+    (with-current-buffer (process-buffer proc)
+      (let ((inhibit-read-only t)
+            ;; `save-excursion' doesn't use the right insertion-type for us.
+            (pos (copy-marker (point) t)))
+        (unwind-protect
+            (progn
+              (goto-char (process-mark proc))
+              ;; We used to use `insert-before-markers', so that windows with
+              ;; point at `process-mark' scroll along with the output, but we
+              ;; now use window-point-insertion-type instead.
+              (insert string)
+              (set-marker (process-mark proc) (point))
+              (run-hooks 'compilation-filter-hook))
+          (goto-char pos))))))
 
 ;;; test if a buffer is a compilation buffer, assuming we're in the buffer
 (defsubst compilation-buffer-internal-p ()