Function: te-process-output
te-process-output is a byte-compiled function defined in
terminal.el.gz.
Signature
(te-process-output PREEMPTIBLE)
Source Code
;; Defined in /usr/src/emacs/lisp/obsolete/terminal.el.gz
;; (A version of the following comment which might be distractingly offensive
;; to some readers has been moved to term-nasty.el.)
;; unix lacks ITS-style tty control...
(defun te-process-output (preemptible)
;;>> There seems no good reason to ever disallow preemption
(setq preemptible t)
(catch 'te-process-output
(let ((buffer-read-only nil)
(string nil) ostring start char (matchpos nil))
(while (cdr te-pending-output)
(setq ostring string
start (car te-pending-output)
string (car (cdr te-pending-output))
char (aref string start))
(if (eq (setq start (1+ start)) (length string))
(progn (setq te-pending-output
(cons 0 (cdr (cdr te-pending-output)))
start 0
string (car (cdr te-pending-output)))
(te-update-pending-output-display))
(setcar te-pending-output start))
(if (and (> char ?\037) (< char ?\377))
(cond ((eolp)
;; unread char
(if (eq start 0)
(setq te-pending-output
(cons 0 (cons (make-string 1 char)
(cdr te-pending-output))))
(setcar te-pending-output (1- start)))
(te-newline))
((null string)
(delete-char 1) (insert char)
(te-redisplay-if-necessary 1))
(t
(let ((end (or (and (eq ostring string) matchpos)
(setq matchpos (string-match
"[\000-\037\177-\377]"
string start))
(length string))))
(delete-char 1) (insert char)
(setq char (point)) (end-of-line)
(setq end (min end (+ start (- (point) char))))
(goto-char char)
(if (eq end matchpos) (setq matchpos nil))
(delete-region (point) (+ (point) (- end start)))
(insert (if (and (eq start 0)
(eq end (length string)))
string
(substring string start end)))
(if (eq end (length string))
(setq te-pending-output
(cons 0 (cdr (cdr te-pending-output))))
(setcar te-pending-output end))
(te-redisplay-if-necessary (1+ (- end start))))))
;; I suppose if I split the guts of this out into a separate
;; function we could trivially emulate different terminals
;; Who cares in any case? (Apart from stupid losers using rlogin)
(funcall
(if (eq char ?\^p)
(or (cdr (assq (te-get-char)
'((?= . te-move-to-position)
(?c . te-clear-rest-of-line)
(?C . te-clear-rest-of-screen)
(?\C-o . te-insert-lines)
(?\C-k . te-delete-lines)
;; not necessary, but help sometimes.
(?\C-a . te-beginning-of-line)
(?\C-b . te-backward-char)
;; should be C-d, but un*x
;; pty's won't send \004 through!
;; Can you believe this?
(?d . te-delete-char)
(?_ . te-insert-spaces)
;; random
(?\C-f . te-forward-char)
(?\C-g . te-beep)
(?\C-j . te-down-vertically-or-scroll)
(?\C-l . te-clear-screen)
)))
'te-losing-unix)
(or (cdr (assq char
'((?\C-j . te-newline)
(?\177 . te-delete)
;; Did I ask to be sent these characters?
;; I don't remember doing so, either.
;; (Perhaps some operating system or
;; other is completely incompetent...)
(?\C-m . te-beginning-of-line)
(?\C-g . te-beep)
(?\C-h . te-backward-char)
(?\C-i . te-output-tab))))
'te-losing-unix)))
(te-redisplay-if-necessary 1))
(and preemptible
(input-pending-p)
;; preemptible output! Oh my!!
(throw 'te-process-output t)))))
;; We must update window-point in every window displaying our buffer
(walk-windows (lambda (w)
(when (and (not (eq w (selected-window)))
(eq (window-buffer w) (current-buffer)))
(set-window-point w (point))))))