]> git.eshelyaron.com Git - emacs.git/commitdiff
(comint-output-filter): Remove ad-hoc saving of restriction, and just
authorMiles Bader <miles@gnu.org>
Sat, 19 Aug 2000 01:55:40 +0000 (01:55 +0000)
committerMiles Bader <miles@gnu.org>
Sat, 19 Aug 2000 01:55:40 +0000 (01:55 +0000)
use save-restriction, now that it works correctly.  Don't adjust
comint-last-input-start to account for our insertion; it shouldn't have
moved because we don't use insert-before-markers anymore.  Comment out
call to `force-mode-line-update'; why is it here?

lisp/comint.el

index da9e279774973f0f6245dc710a9fba4f61082801..84e4f54949b5167271c064cb75e1424bba3105fc 100644 (file)
@@ -1493,81 +1493,68 @@ This variable is permanent-local.")
            (setq string (funcall (car functions) string))
            (setq functions (cdr functions))))
 
-       ;; Do insertion.  We don't use save-restriction because it has a
-       ;; bug, so we fake it by saving any current restriction, and
-       ;; then later restoring it.
-       (let ((opoint (point))
-             (obeg (point-min))
-             (oend (point-max))
-             (buffer-read-only nil)
-             (nchars (length string))
-             (ostart (process-mark process)))
-         (widen)
-         (goto-char ostart)
-
-         ;; Adjust buffer positions to account for about-to-be-inserted text
-         (if (<= (point) opoint)
-             (setq opoint (+ opoint nchars)))
-         ;; Insert after old_begv, but before old_zv.
-         (if (< (point) obeg)
-             (setq obeg (+ obeg nchars)))
-         (if (<= (point) oend)
-             (setq oend (+ oend nchars)))
-
-         (insert string)
-
-         (unless comint-use-prompt-regexp-instead-of-fields
-           ;; We check to see if the last overlay used for output is
-           ;; adjacent to the new input, and if so, just extend it.
-           (if (and comint-last-output-overlay
-                    (equal (overlay-end comint-last-output-overlay) ostart))
-               ;; Extend comint-last-output-overlay to include the
-               ;; most recent output
-               (move-overlay comint-last-output-overlay
-                             (overlay-start comint-last-output-overlay)
-                             (point))
-             ;; Create a new overlay
-             (let ((over (make-overlay ostart (point))))
-               (overlay-put over 'field 'output)
-               (overlay-put over 'rear-nonsticky t)
-               (overlay-put over 'inhibit-line-move-field-capture t)
-               (overlay-put over 'evaporate t)
-               (setq comint-last-output-overlay over))))
-
-         (when comint-highlight-prompt
-           ;; Highlight the prompt, where we define `prompt' to mean
-           ;; the most recent output that doesn't end with a newline.
-           (unless (and (bolp) (null comint-last-prompt-overlay))
-             ;; Need to create or move the prompt overlay (in the case
-             ;; where there is no prompt ((bolp) == t), we still do
-             ;; this if there's already an existing overlay).
-             (let ((prompt-start (save-excursion (forward-line 0) (point))))
-               (if comint-last-prompt-overlay
-                   ;; Just move an existing overlay
-                   (move-overlay comint-last-prompt-overlay
-                                 prompt-start (point))
-                 ;; Need to create the overlay
-                 (setq comint-last-prompt-overlay
-                       (make-overlay prompt-start (point)))
-                 (overlay-put comint-last-prompt-overlay
-                              'rear-nonsticky t)
-                 (overlay-put comint-last-prompt-overlay
-                              'face 'comint-highlight-prompt-face)))))
-
-         (if (and comint-last-input-end
-                  (marker-buffer comint-last-input-end)
-                  (= (point) comint-last-input-end))
-             (set-marker comint-last-input-end
-                         (- comint-last-input-end nchars)))
-         (set-marker comint-last-output-start ostart)
-         (set-marker (process-mark process) (point))
-         (force-mode-line-update)
-
-         ;; Restore our saved restriction, and the point
-         (narrow-to-region obeg oend)
-         (goto-char opoint)
-
-         (run-hook-with-args 'comint-output-filter-functions string))))))
+       ;; Insert STRING
+       (let ((buffer-read-only nil)
+             ;; Avoid the overhead of save-excursion, since we just
+             ;; fiddle with the point
+             (saved-point (point)))
+
+         ;; We temporarly remove any buffer narrowing, in case the
+         ;; process mark is outside of the restriction
+         (save-restriction
+           (widen)
+
+           (goto-char (process-mark process))
+           (set-marker comint-last-output-start (point))
+
+           (insert string)
+
+           (set-marker (process-mark process) (point))
+
+           (unless comint-use-prompt-regexp-instead-of-fields
+             ;; We check to see if the last overlay used for output is
+             ;; adjacent to the new input, and if so, just extend it.
+             (if (and comint-last-output-overlay
+                      (equal (overlay-end comint-last-output-overlay)
+                             (point)))
+                 ;; Extend comint-last-output-overlay to include the
+                 ;; most recent output
+                 (move-overlay comint-last-output-overlay
+                               (overlay-start comint-last-output-overlay)
+                               (point))
+               ;; Create a new overlay
+               (let ((over (make-overlay comint-last-output-start (point))))
+                 (overlay-put over 'field 'output)
+                 (overlay-put over 'rear-nonsticky t)
+                 (overlay-put over 'inhibit-line-move-field-capture t)
+                 (overlay-put over 'evaporate t)
+                 (setq comint-last-output-overlay over))))
+
+           (when comint-highlight-prompt
+             ;; Highlight the prompt, where we define `prompt' to mean
+             ;; the most recent output that doesn't end with a newline.
+             (unless (and (bolp) (null comint-last-prompt-overlay))
+               ;; Need to create or move the prompt overlay (in the case
+               ;; where there is no prompt ((bolp) == t), we still do
+               ;; this if there's already an existing overlay).
+               (let ((prompt-start (save-excursion (forward-line 0) (point))))
+                 (if comint-last-prompt-overlay
+                     ;; Just move an existing overlay
+                     (move-overlay comint-last-prompt-overlay
+                                   prompt-start (point))
+                   ;; Need to create the overlay
+                   (setq comint-last-prompt-overlay
+                         (make-overlay prompt-start (point)))
+                   (overlay-put comint-last-prompt-overlay
+                                'rear-nonsticky t)
+                   (overlay-put comint-last-prompt-overlay
+                                'face 'comint-highlight-prompt-face)))))
+
+           ;;(force-mode-line-update)
+
+           (goto-char saved-point)
+
+           (run-hook-with-args 'comint-output-filter-functions string)))))))
 
 (defun comint-preinput-scroll-to-bottom ()
   "Go to the end of buffer in all windows showing it.