# HG changeset patch # User Stefan Monnier # Date 1213374136 0 # Node ID d5d7186027e26241ec4f699dc77bd4a2ecd0acdb # Parent 22320e063151310bea38c7a107250474d2f5a70f * 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. diff -r 22320e063151 -r d5d7186027e2 lisp/ChangeLog --- 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 + + * 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 * textmodes/flyspell.el (mail-mode-flyspell-verify): diff -r 22320e063151 -r d5d7186027e2 lisp/comint.el --- 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 diff -r 22320e063151 -r d5d7186027e2 lisp/progmodes/compile.el --- 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 ()