(comint-output-filter): Doc fixes & misc code cleanup.

This commit is contained in:
Miles Bader 2000-08-10 13:07:25 +00:00
parent af71853819
commit 867102f2b8
2 changed files with 76 additions and 66 deletions

View file

@ -1,3 +1,7 @@
2000-08-10 Miles Bader <miles@gnu.org>
* comint.el (comint-output-filter): Doc fixes & misc code cleanup.
2000-08-10 Eli Zaretskii <eliz@is.elta.co.il>
* info.el (Info-file-list-for-emacs): More elements for the

View file

@ -1487,83 +1487,89 @@ This variable is permanent-local.")
;; First check for killed buffer or no input.
(when (and string oprocbuf (buffer-name oprocbuf))
(with-current-buffer oprocbuf
;; Run preoutput filters
(let ((functions comint-preoutput-filter-functions))
(while (and functions string)
(setq string (funcall (car functions) string))
(setq functions (cdr functions))))
(let (opoint obeg oend)
(setq opoint (point))
(setq obeg (point-min))
(setq oend (point-max))
(let ((buffer-read-only nil)
(nchars (length string))
(ostart nil))
(widen)
(goto-char (process-mark process))
(setq ostart (point))
(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)
;; 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)
(unless comint-use-prompt-regexp-instead-of-fields
;; We check to see if the last overlay used for output has
;; already been extended to include STRING (because it was
;; inserted with insert-before-markers?), and only make
;; a new overlay if it hasn't.
(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))))
;; 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)))
(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's 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)))))
(insert string)
;; Don't insert initial prompt outside the top of the window.
(if (= (window-start (selected-window)) (point))
(set-window-start (selected-window) (- (point) (length string))))
(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))
(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's 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)))))
;; Don't insert initial prompt outside the top of the window.
(if (= (window-start (selected-window)) (point))
(set-window-start (selected-window) (- (point) (length string))))
(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))))))
(defun comint-preinput-scroll-to-bottom ()