diff options
| author | Richard M. Stallman | 2004-09-20 15:59:31 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 2004-09-20 15:59:31 +0000 |
| commit | fd4f1b364f0407a013cb1a2380ae2e99b0d50473 (patch) | |
| tree | 1b516ce281d6609bbab6cbcd9d24e0af82dd3bff | |
| parent | 451eaf8db389f91c56f6257e0f54b5ef3e361f3e (diff) | |
| download | emacs-fd4f1b364f0407a013cb1a2380ae2e99b0d50473.tar.gz emacs-fd4f1b364f0407a013cb1a2380ae2e99b0d50473.zip | |
(term-emulate-terminal): Turn off undo for output.
Use with-current-buffer and save-selected-window.
| -rw-r--r-- | lisp/term.el | 590 |
1 files changed, 293 insertions, 297 deletions
diff --git a/lisp/term.el b/lisp/term.el index ffe64331d41..0fbe5b2f154 100644 --- a/lisp/term.el +++ b/lisp/term.el | |||
| @@ -2635,314 +2635,310 @@ See `term-prompt-regexp'." | |||
| 2635 | ;;; It emulates (most of the features of) a VT100/ANSI-style terminal. | 2635 | ;;; It emulates (most of the features of) a VT100/ANSI-style terminal. |
| 2636 | 2636 | ||
| 2637 | (defun term-emulate-terminal (proc str) | 2637 | (defun term-emulate-terminal (proc str) |
| 2638 | (let* ((previous-buffer (current-buffer)) | 2638 | (with-current-buffer (process-buffer proc) |
| 2639 | (i 0) char funny count save-point save-marker old-point temp win | 2639 | (let* ((i 0) char funny count save-point save-marker old-point temp win |
| 2640 | (selected (selected-window)) | 2640 | (buffer-undo-list t) |
| 2641 | last-win | 2641 | (selected (selected-window)) |
| 2642 | (str-length (length str))) | 2642 | last-win |
| 2643 | (unwind-protect | 2643 | (str-length (length str))) |
| 2644 | (progn | 2644 | (save-selected-window |
| 2645 | (set-buffer (process-buffer proc)) | 2645 | |
| 2646 | 2646 | ;; Let's handle the messages. -mm | |
| 2647 | ;;; Let's handle the messages. -mm | 2647 | |
| 2648 | 2648 | (setq str (term-handle-ansi-terminal-messages str)) | |
| 2649 | (setq str (term-handle-ansi-terminal-messages str)) | 2649 | (setq str-length (length str)) |
| 2650 | (setq str-length (length str)) | 2650 | |
| 2651 | 2651 | (if (marker-buffer term-pending-delete-marker) | |
| 2652 | (if (marker-buffer term-pending-delete-marker) | 2652 | (progn |
| 2653 | (progn | 2653 | ;; Delete text following term-pending-delete-marker. |
| 2654 | ;; Delete text following term-pending-delete-marker. | 2654 | (delete-region term-pending-delete-marker (process-mark proc)) |
| 2655 | (delete-region term-pending-delete-marker (process-mark proc)) | 2655 | (set-marker term-pending-delete-marker nil))) |
| 2656 | (set-marker term-pending-delete-marker nil))) | 2656 | |
| 2657 | 2657 | (if (eq (window-buffer) (current-buffer)) | |
| 2658 | (if (eq (window-buffer) (current-buffer)) | 2658 | (progn |
| 2659 | (progn | 2659 | (setq term-vertical-motion (symbol-function 'vertical-motion)) |
| 2660 | (setq term-vertical-motion (symbol-function 'vertical-motion)) | 2660 | (term-check-size proc)) |
| 2661 | (term-check-size proc)) | 2661 | (setq term-vertical-motion |
| 2662 | (setq term-vertical-motion | 2662 | (symbol-function 'buffer-vertical-motion))) |
| 2663 | (symbol-function 'buffer-vertical-motion))) | 2663 | |
| 2664 | 2664 | (setq save-marker (copy-marker (process-mark proc))) | |
| 2665 | (setq save-marker (copy-marker (process-mark proc))) | 2665 | |
| 2666 | 2666 | (if (/= (point) (process-mark proc)) | |
| 2667 | (if (/= (point) (process-mark proc)) | 2667 | (progn (setq save-point (point-marker)) |
| 2668 | (progn (setq save-point (point-marker)) | 2668 | (goto-char (process-mark proc)))) |
| 2669 | (goto-char (process-mark proc)))) | 2669 | |
| 2670 | 2670 | (save-restriction | |
| 2671 | (save-restriction | 2671 | ;; If the buffer is in line mode, and there is a partial |
| 2672 | ;; If the buffer is in line mode, and there is a partial | 2672 | ;; input line, save the line (by narrowing to leave it |
| 2673 | ;; input line, save the line (by narrowing to leave it | 2673 | ;; outside the restriction ) until we're done with output. |
| 2674 | ;; outside the restriction ) until we're done with output. | 2674 | (if (and (> (point-max) (process-mark proc)) |
| 2675 | (if (and (> (point-max) (process-mark proc)) | 2675 | (term-in-line-mode)) |
| 2676 | (term-in-line-mode)) | 2676 | (narrow-to-region (point-min) (process-mark proc))) |
| 2677 | (narrow-to-region (point-min) (process-mark proc))) | 2677 | |
| 2678 | 2678 | (if term-log-buffer | |
| 2679 | (if term-log-buffer | 2679 | (princ str term-log-buffer)) |
| 2680 | (princ str term-log-buffer)) | 2680 | (cond ((eq term-terminal-state 4) ;; Have saved pending output. |
| 2681 | (cond ((eq term-terminal-state 4) ;; Have saved pending output. | 2681 | (setq str (concat term-terminal-parameter str)) |
| 2682 | (setq str (concat term-terminal-parameter str)) | 2682 | (setq term-terminal-parameter nil) |
| 2683 | (setq term-terminal-parameter nil) | 2683 | (setq str-length (length str)) |
| 2684 | (setq str-length (length str)) | 2684 | (setq term-terminal-state 0))) |
| 2685 | (setq term-terminal-state 0))) | 2685 | |
| 2686 | 2686 | (while (< i str-length) | |
| 2687 | (while (< i str-length) | 2687 | (setq char (aref str i)) |
| 2688 | (setq char (aref str i)) | 2688 | (cond ((< term-terminal-state 2) |
| 2689 | (cond ((< term-terminal-state 2) | 2689 | ;; Look for prefix of regular chars |
| 2690 | ;; Look for prefix of regular chars | 2690 | (setq funny |
| 2691 | (setq funny | 2691 | (string-match "[\r\n\000\007\033\t\b\032\016\017]" |
| 2692 | (string-match "[\r\n\000\007\033\t\b\032\016\017]" | 2692 | str i)) |
| 2693 | str i)) | 2693 | (if (not funny) (setq funny str-length)) |
| 2694 | (if (not funny) (setq funny str-length)) | 2694 | (cond ((> funny i) |
| 2695 | (cond ((> funny i) | 2695 | (cond ((eq term-terminal-state 1) |
| 2696 | (cond ((eq term-terminal-state 1) | 2696 | (term-move-columns 1) |
| 2697 | (term-move-columns 1) | 2697 | (setq term-terminal-state 0))) |
| 2698 | (setq term-terminal-state 0))) | 2698 | (setq count (- funny i)) |
| 2699 | (setq count (- funny i)) | 2699 | (setq temp (- (+ (term-horizontal-column) count) |
| 2700 | (setq temp (- (+ (term-horizontal-column) count) | 2700 | term-width)) |
| 2701 | term-width)) | 2701 | (cond ((<= temp 0)) ;; All count chars fit in line. |
| 2702 | (cond ((<= temp 0)) ;; All count chars fit in line. | 2702 | ((> count temp) ;; Some chars fit. |
| 2703 | ((> count temp) ;; Some chars fit. | 2703 | ;; This iteration, handle only what fits. |
| 2704 | ;; This iteration, handle only what fits. | 2704 | (setq count (- count temp)) |
| 2705 | (setq count (- count temp)) | 2705 | (setq funny (+ count i))) |
| 2706 | (setq funny (+ count i))) | 2706 | ((or (not (or term-pager-count |
| 2707 | ((or (not (or term-pager-count | 2707 | term-scroll-with-delete)) |
| 2708 | term-scroll-with-delete)) | 2708 | (> (term-handle-scroll 1) 0)) |
| 2709 | (> (term-handle-scroll 1) 0)) | 2709 | (term-adjust-current-row-cache 1) |
| 2710 | (term-adjust-current-row-cache 1) | 2710 | (setq count (min count term-width)) |
| 2711 | (setq count (min count term-width)) | 2711 | (setq funny (+ count i)) |
| 2712 | (setq funny (+ count i)) | 2712 | (setq term-start-line-column |
| 2713 | (setq term-start-line-column | 2713 | term-current-column)) |
| 2714 | term-current-column)) | 2714 | (t ;; Doing PAGER processing. |
| 2715 | (t ;; Doing PAGER processing. | 2715 | (setq count 0 funny i) |
| 2716 | (setq count 0 funny i) | 2716 | (setq term-current-column nil) |
| 2717 | (setq term-current-column nil) | 2717 | (setq term-start-line-column nil))) |
| 2718 | (setq term-start-line-column nil))) | 2718 | (setq old-point (point)) |
| 2719 | (setq old-point (point)) | 2719 | |
| 2720 | 2720 | ;; Insert a string, check how many columns | |
| 2721 | ;; Insert a string, check how many columns | 2721 | ;; we moved, then delete that many columns |
| 2722 | ;; we moved, then delete that many columns | 2722 | ;; following point if not eob nor insert-mode. |
| 2723 | ;; following point if not eob nor insert-mode. | 2723 | (let ((old-column (current-column)) |
| 2724 | (let ((old-column (current-column)) | 2724 | columns pos) |
| 2725 | columns pos) | 2725 | (insert (substring str i funny)) |
| 2726 | (insert (substring str i funny)) | 2726 | (setq term-current-column (current-column) |
| 2727 | (setq term-current-column (current-column) | 2727 | columns (- term-current-column old-column)) |
| 2728 | columns (- term-current-column old-column)) | 2728 | (when (not (or (eobp) term-insert-mode)) |
| 2729 | (when (not (or (eobp) term-insert-mode)) | 2729 | (setq pos (point)) |
| 2730 | (setq pos (point)) | 2730 | (term-move-columns columns) |
| 2731 | (term-move-columns columns) | 2731 | (delete-region pos (point)))) |
| 2732 | (delete-region pos (point)))) | 2732 | (setq term-current-column nil) |
| 2733 | (setq term-current-column nil) | 2733 | |
| 2734 | 2734 | (put-text-property old-point (point) | |
| 2735 | (put-text-property old-point (point) | 2735 | 'face term-current-face) |
| 2736 | 'face term-current-face) | 2736 | ;; If the last char was written in last column, |
| 2737 | ;; If the last char was written in last column, | 2737 | ;; back up one column, but remember we did so. |
| 2738 | ;; back up one column, but remember we did so. | 2738 | ;; Thus we emulate xterm/vt100-style line-wrapping. |
| 2739 | ;; Thus we emulate xterm/vt100-style line-wrapping. | 2739 | (cond ((eq temp 0) |
| 2740 | (cond ((eq temp 0) | 2740 | (term-move-columns -1) |
| 2741 | (term-move-columns -1) | 2741 | (setq term-terminal-state 1))) |
| 2742 | (setq term-terminal-state 1))) | 2742 | (setq i (1- funny))) |
| 2743 | (setq i (1- funny))) | 2743 | ((and (setq term-terminal-state 0) |
| 2744 | ((and (setq term-terminal-state 0) | 2744 | (eq char ?\^I)) ; TAB |
| 2745 | (eq char ?\^I)) ; TAB | 2745 | ;; FIXME: Does not handle line wrap! |
| 2746 | ;; FIXME: Does not handle line wrap! | 2746 | (setq count (term-current-column)) |
| 2747 | (setq count (term-current-column)) | 2747 | (setq count (+ count 8 (- (mod count 8)))) |
| 2748 | (setq count (+ count 8 (- (mod count 8)))) | 2748 | (if (< (move-to-column count nil) count) |
| 2749 | (if (< (move-to-column count nil) count) | 2749 | (term-insert-char char 1)) |
| 2750 | (term-insert-char char 1)) | 2750 | (setq term-current-column count)) |
| 2751 | (setq term-current-column count)) | 2751 | ((eq char ?\r) |
| 2752 | ((eq char ?\r) | 2752 | ;; Optimize CRLF at end of buffer: |
| 2753 | ;; Optimize CRLF at end of buffer: | 2753 | (cond ((and (< (setq temp (1+ i)) str-length) |
| 2754 | (cond ((and (< (setq temp (1+ i)) str-length) | 2754 | (eq (aref str temp) ?\n) |
| 2755 | (eq (aref str temp) ?\n) | 2755 | (= (point) (point-max)) |
| 2756 | (= (point) (point-max)) | 2756 | (not (or term-pager-count |
| 2757 | (not (or term-pager-count | 2757 | term-kill-echo-list |
| 2758 | term-kill-echo-list | 2758 | term-scroll-with-delete))) |
| 2759 | term-scroll-with-delete))) | 2759 | (insert ?\n) |
| 2760 | (insert ?\n) | 2760 | (term-adjust-current-row-cache 1) |
| 2761 | (term-adjust-current-row-cache 1) | 2761 | (setq term-start-line-column 0) |
| 2762 | (setq term-start-line-column 0) | 2762 | (setq term-current-column 0) |
| 2763 | (setq term-current-column 0) | 2763 | (setq i temp)) |
| 2764 | (setq i temp)) | 2764 | (t ;; Not followed by LF or can't optimize: |
| 2765 | (t ;; Not followed by LF or can't optimize: | 2765 | (term-vertical-motion 0) |
| 2766 | (term-vertical-motion 0) | 2766 | (setq term-current-column term-start-line-column)))) |
| 2767 | (setq term-current-column term-start-line-column)))) | 2767 | ((eq char ?\n) |
| 2768 | ((eq char ?\n) | 2768 | (if (not (and term-kill-echo-list |
| 2769 | (if (not (and term-kill-echo-list | 2769 | (term-check-kill-echo-list))) |
| 2770 | (term-check-kill-echo-list))) | 2770 | (term-down 1 t))) |
| 2771 | (term-down 1 t))) | 2771 | ((eq char ?\b) |
| 2772 | ((eq char ?\b) | 2772 | (term-move-columns -1)) |
| 2773 | (term-move-columns -1)) | 2773 | ((eq char ?\033) ; Escape |
| 2774 | ((eq char ?\033) ; Escape | 2774 | (setq term-terminal-state 2)) |
| 2775 | (setq term-terminal-state 2)) | 2775 | ((eq char 0)) ; NUL: Do nothing |
| 2776 | ((eq char 0)) ; NUL: Do nothing | 2776 | ((eq char ?\016)) ; Shift Out - ignored |
| 2777 | ((eq char ?\016)) ; Shift Out - ignored | 2777 | ((eq char ?\017)) ; Shift In - ignored |
| 2778 | ((eq char ?\017)) ; Shift In - ignored | 2778 | ((eq char ?\^G) |
| 2779 | ((eq char ?\^G) | 2779 | (beep t)) ; Bell |
| 2780 | (beep t)) ; Bell | 2780 | ((eq char ?\032) |
| 2781 | ((eq char ?\032) | 2781 | (let ((end (string-match "\r?$" str i))) |
| 2782 | (let ((end (string-match "\r?$" str i))) | 2782 | (if end |
| 2783 | (if end | 2783 | (funcall term-command-hook |
| 2784 | (funcall term-command-hook | 2784 | (prog1 (substring str (1+ i) end) |
| 2785 | (prog1 (substring str (1+ i) end) | 2785 | (setq i (match-end 0)))) |
| 2786 | (setq i (match-end 0)))) | 2786 | (setq term-terminal-parameter |
| 2787 | (setq term-terminal-parameter | 2787 | (substring str i)) |
| 2788 | (substring str i)) | 2788 | (setq term-terminal-state 4) |
| 2789 | (setq term-terminal-state 4) | 2789 | (setq i str-length)))) |
| 2790 | (setq i str-length)))) | 2790 | (t ; insert char FIXME: Should never happen |
| 2791 | (t ; insert char FIXME: Should never happen | 2791 | (term-move-columns 1) |
| 2792 | (term-move-columns 1) | 2792 | (backward-delete-char 1) |
| 2793 | (backward-delete-char 1) | 2793 | (insert char)))) |
| 2794 | (insert char)))) | 2794 | ((eq term-terminal-state 2) ; Seen Esc |
| 2795 | ((eq term-terminal-state 2) ; Seen Esc | 2795 | (cond ((eq char ?\133) ;; ?\133 = ?[ |
| 2796 | (cond ((eq char ?\133) ;; ?\133 = ?[ | ||
| 2797 | 2796 | ||
| 2798 | ;;; Some modifications to cope with multiple settings like ^[[01;32;43m -mm | 2797 | ;;; Some modifications to cope with multiple settings like ^[[01;32;43m -mm |
| 2799 | ;;; Note that now the init value of term-terminal-previous-parameter has | 2798 | ;;; Note that now the init value of term-terminal-previous-parameter has |
| 2800 | ;;; been changed to -1 | 2799 | ;;; been changed to -1 |
| 2801 | 2800 | ||
| 2802 | (make-local-variable 'term-terminal-parameter) | 2801 | (make-local-variable 'term-terminal-parameter) |
| 2803 | (make-local-variable 'term-terminal-previous-parameter) | 2802 | (make-local-variable 'term-terminal-previous-parameter) |
| 2804 | (make-local-variable 'term-terminal-previous-parameter-2) | 2803 | (make-local-variable 'term-terminal-previous-parameter-2) |
| 2805 | (make-local-variable 'term-terminal-previous-parameter-3) | 2804 | (make-local-variable 'term-terminal-previous-parameter-3) |
| 2806 | (make-local-variable 'term-terminal-previous-parameter-4) | 2805 | (make-local-variable 'term-terminal-previous-parameter-4) |
| 2807 | (make-local-variable 'term-terminal-more-parameters) | 2806 | (make-local-variable 'term-terminal-more-parameters) |
| 2808 | (setq term-terminal-parameter 0) | 2807 | (setq term-terminal-parameter 0) |
| 2809 | (setq term-terminal-previous-parameter -1) | 2808 | (setq term-terminal-previous-parameter -1) |
| 2810 | (setq term-terminal-previous-parameter-2 -1) | 2809 | (setq term-terminal-previous-parameter-2 -1) |
| 2811 | (setq term-terminal-previous-parameter-3 -1) | 2810 | (setq term-terminal-previous-parameter-3 -1) |
| 2812 | (setq term-terminal-previous-parameter-4 -1) | 2811 | (setq term-terminal-previous-parameter-4 -1) |
| 2813 | (setq term-terminal-more-parameters 0) | 2812 | (setq term-terminal-more-parameters 0) |
| 2814 | (setq term-terminal-state 3)) | 2813 | (setq term-terminal-state 3)) |
| 2815 | ((eq char ?D) ;; scroll forward | 2814 | ((eq char ?D) ;; scroll forward |
| 2816 | (term-handle-deferred-scroll) | 2815 | (term-handle-deferred-scroll) |
| 2817 | (term-down 1 t) | 2816 | (term-down 1 t) |
| 2818 | (setq term-terminal-state 0)) | 2817 | (setq term-terminal-state 0)) |
| 2819 | ((eq char ?M) ;; scroll reversed | 2818 | ((eq char ?M) ;; scroll reversed |
| 2820 | (term-insert-lines 1) | 2819 | (term-insert-lines 1) |
| 2821 | (setq term-terminal-state 0)) | 2820 | (setq term-terminal-state 0)) |
| 2822 | ((eq char ?7) ;; Save cursor | 2821 | ((eq char ?7) ;; Save cursor |
| 2823 | (term-handle-deferred-scroll) | 2822 | (term-handle-deferred-scroll) |
| 2824 | (setq term-saved-cursor | 2823 | (setq term-saved-cursor |
| 2825 | (cons (term-current-row) | 2824 | (cons (term-current-row) |
| 2826 | (term-horizontal-column))) | 2825 | (term-horizontal-column))) |
| 2827 | (setq term-terminal-state 0)) | 2826 | (setq term-terminal-state 0)) |
| 2828 | ((eq char ?8) ;; Restore cursor | 2827 | ((eq char ?8) ;; Restore cursor |
| 2829 | (if term-saved-cursor | 2828 | (if term-saved-cursor |
| 2830 | (term-goto (car term-saved-cursor) | 2829 | (term-goto (car term-saved-cursor) |
| 2831 | (cdr term-saved-cursor))) | 2830 | (cdr term-saved-cursor))) |
| 2832 | (setq term-terminal-state 0)) | 2831 | (setq term-terminal-state 0)) |
| 2833 | ((setq term-terminal-state 0)))) | 2832 | ((setq term-terminal-state 0)))) |
| 2834 | ((eq term-terminal-state 3) ; Seen Esc [ | 2833 | ((eq term-terminal-state 3) ; Seen Esc [ |
| 2835 | (cond ((and (>= char ?0) (<= char ?9)) | 2834 | (cond ((and (>= char ?0) (<= char ?9)) |
| 2836 | (setq term-terminal-parameter | 2835 | (setq term-terminal-parameter |
| 2837 | (+ (* 10 term-terminal-parameter) (- char ?0)))) | 2836 | (+ (* 10 term-terminal-parameter) (- char ?0)))) |
| 2838 | ((eq char ?\;) | 2837 | ((eq char ?\;) |
| 2839 | ;;; Some modifications to cope with multiple settings like ^[[01;32;43m -mm | 2838 | ;;; Some modifications to cope with multiple settings like ^[[01;32;43m -mm |
| 2840 | (setq term-terminal-more-parameters 1) | 2839 | (setq term-terminal-more-parameters 1) |
| 2841 | (setq term-terminal-previous-parameter-4 | 2840 | (setq term-terminal-previous-parameter-4 |
| 2842 | term-terminal-previous-parameter-3) | 2841 | term-terminal-previous-parameter-3) |
| 2843 | (setq term-terminal-previous-parameter-3 | 2842 | (setq term-terminal-previous-parameter-3 |
| 2844 | term-terminal-previous-parameter-2) | 2843 | term-terminal-previous-parameter-2) |
| 2845 | (setq term-terminal-previous-parameter-2 | 2844 | (setq term-terminal-previous-parameter-2 |
| 2846 | term-terminal-previous-parameter) | 2845 | term-terminal-previous-parameter) |
| 2847 | (setq term-terminal-previous-parameter | 2846 | (setq term-terminal-previous-parameter |
| 2848 | term-terminal-parameter) | 2847 | term-terminal-parameter) |
| 2849 | (setq term-terminal-parameter 0)) | 2848 | (setq term-terminal-parameter 0)) |
| 2850 | ((eq char ??)) ; Ignore ? | 2849 | ((eq char ??)) ; Ignore ? |
| 2851 | (t | 2850 | (t |
| 2852 | (term-handle-ansi-escape proc char) | 2851 | (term-handle-ansi-escape proc char) |
| 2853 | (setq term-terminal-more-parameters 0) | 2852 | (setq term-terminal-more-parameters 0) |
| 2854 | (setq term-terminal-previous-parameter-4 -1) | 2853 | (setq term-terminal-previous-parameter-4 -1) |
| 2855 | (setq term-terminal-previous-parameter-3 -1) | 2854 | (setq term-terminal-previous-parameter-3 -1) |
| 2856 | (setq term-terminal-previous-parameter-2 -1) | 2855 | (setq term-terminal-previous-parameter-2 -1) |
| 2857 | (setq term-terminal-previous-parameter -1) | 2856 | (setq term-terminal-previous-parameter -1) |
| 2858 | (setq term-terminal-state 0))))) | 2857 | (setq term-terminal-state 0))))) |
| 2859 | (if (term-handling-pager) | 2858 | (if (term-handling-pager) |
| 2860 | ;; Finish stuff to get ready to handle PAGER. | 2859 | ;; Finish stuff to get ready to handle PAGER. |
| 2861 | (progn | 2860 | (progn |
| 2862 | (if (> (% (current-column) term-width) 0) | 2861 | (if (> (% (current-column) term-width) 0) |
| 2862 | (setq term-terminal-parameter | ||
| 2863 | (substring str i)) | ||
| 2864 | ;; We're at column 0. Goto end of buffer; to compensate, | ||
| 2865 | ;; prepend a ?\r for later. This looks more consistent. | ||
| 2866 | (if (zerop i) | ||
| 2863 | (setq term-terminal-parameter | 2867 | (setq term-terminal-parameter |
| 2864 | (substring str i)) | 2868 | (concat "\r" (substring str i))) |
| 2865 | ;; We're at column 0. Goto end of buffer; to compensate, | 2869 | (setq term-terminal-parameter (substring str (1- i))) |
| 2866 | ;; prepend a ?\r for later. This looks more consistent. | 2870 | (aset term-terminal-parameter 0 ?\r)) |
| 2867 | (if (zerop i) | 2871 | (goto-char (point-max))) |
| 2868 | (setq term-terminal-parameter | 2872 | (setq term-terminal-state 4) |
| 2869 | (concat "\r" (substring str i))) | 2873 | (make-local-variable 'term-pager-old-filter) |
| 2870 | (setq term-terminal-parameter (substring str (1- i))) | 2874 | (setq term-pager-old-filter (process-filter proc)) |
| 2871 | (aset term-terminal-parameter 0 ?\r)) | 2875 | (set-process-filter proc term-pager-filter) |
| 2872 | (goto-char (point-max))) | 2876 | (setq i str-length))) |
| 2873 | (setq term-terminal-state 4) | 2877 | (setq i (1+ i)))) |
| 2874 | (make-local-variable 'term-pager-old-filter) | 2878 | |
| 2875 | (setq term-pager-old-filter (process-filter proc)) | 2879 | (if (>= (term-current-row) term-height) |
| 2876 | (set-process-filter proc term-pager-filter) | 2880 | (term-handle-deferred-scroll)) |
| 2877 | (setq i str-length))) | 2881 | |
| 2878 | (setq i (1+ i)))) | 2882 | (set-marker (process-mark proc) (point)) |
| 2879 | 2883 | (if save-point | |
| 2880 | (if (>= (term-current-row) term-height) | 2884 | (progn (goto-char save-point) |
| 2881 | (term-handle-deferred-scroll)) | 2885 | (set-marker save-point nil))) |
| 2882 | 2886 | ||
| 2883 | (set-marker (process-mark proc) (point)) | 2887 | ;; Check for a pending filename-and-line number to display. |
| 2884 | (if save-point | 2888 | ;; We do this before scrolling, because we might create a new window. |
| 2885 | (progn (goto-char save-point) | 2889 | (if (and term-pending-frame |
| 2886 | (set-marker save-point nil))) | 2890 | (eq (window-buffer selected) (current-buffer))) |
| 2887 | 2891 | (progn (term-display-line (car term-pending-frame) | |
| 2888 | ;; Check for a pending filename-and-line number to display. | 2892 | (cdr term-pending-frame)) |
| 2889 | ;; We do this before scrolling, because we might create a new window. | 2893 | (setq term-pending-frame nil) |
| 2890 | (if (and term-pending-frame | 2894 | ;; We have created a new window, so check the window size. |
| 2891 | (eq (window-buffer selected) (current-buffer))) | 2895 | (term-check-size proc))) |
| 2892 | (progn (term-display-line (car term-pending-frame) | 2896 | |
| 2893 | (cdr term-pending-frame)) | 2897 | ;; Scroll each window displaying the buffer but (by default) |
| 2894 | (setq term-pending-frame nil) | 2898 | ;; only if the point matches the process-mark we started with. |
| 2895 | ;; We have created a new window, so check the window size. | 2899 | (setq win selected) |
| 2896 | (term-check-size proc))) | 2900 | ;; Avoid infinite loop in strange case where minibuffer window |
| 2897 | 2901 | ;; is selected but not active. | |
| 2898 | ;; Scroll each window displaying the buffer but (by default) | 2902 | (while (window-minibuffer-p win) |
| 2899 | ;; only if the point matches the process-mark we started with. | 2903 | (setq win (next-window win nil t))) |
| 2900 | (setq win selected) | 2904 | (setq last-win win) |
| 2901 | ;; Avoid infinite loop in strange case where minibuffer window | 2905 | (while (progn |
| 2902 | ;; is selected but not active. | 2906 | (setq win (next-window win nil t)) |
| 2903 | (while (window-minibuffer-p win) | 2907 | (if (eq (window-buffer win) (process-buffer proc)) |
| 2904 | (setq win (next-window win nil t))) | 2908 | (let ((scroll term-scroll-to-bottom-on-output)) |
| 2905 | (setq last-win win) | 2909 | (select-window win) |
| 2906 | (while (progn | 2910 | (if (or (= (point) save-marker) |
| 2907 | (setq win (next-window win nil t)) | 2911 | (eq scroll t) (eq scroll 'all) |
| 2908 | (if (eq (window-buffer win) (process-buffer proc)) | 2912 | ;; Maybe user wants point to jump to the end. |
| 2909 | (let ((scroll term-scroll-to-bottom-on-output)) | 2913 | (and (eq selected win) |
| 2910 | (select-window win) | 2914 | (or (eq scroll 'this) (not save-point))) |
| 2911 | (if (or (= (point) save-marker) | 2915 | (and (eq scroll 'others) |
| 2912 | (eq scroll t) (eq scroll 'all) | 2916 | (not (eq selected win)))) |
| 2913 | ;; Maybe user wants point to jump to the end. | 2917 | (progn |
| 2914 | (and (eq selected win) | 2918 | (goto-char term-home-marker) |
| 2915 | (or (eq scroll 'this) (not save-point))) | 2919 | (recenter 0) |
| 2916 | (and (eq scroll 'others) | 2920 | (goto-char (process-mark proc)) |
| 2917 | (not (eq selected win)))) | 2921 | (if (not (pos-visible-in-window-p (point) win)) |
| 2918 | (progn | 2922 | (recenter -1)))) |
| 2919 | (goto-char term-home-marker) | 2923 | ;; Optionally scroll so that the text |
| 2920 | (recenter 0) | 2924 | ;; ends at the bottom of the window. |
| 2921 | (goto-char (process-mark proc)) | 2925 | (if (and term-scroll-show-maximum-output |
| 2922 | (if (not (pos-visible-in-window-p (point) win)) | 2926 | (>= (point) (process-mark proc))) |
| 2923 | (recenter -1)))) | 2927 | (save-excursion |
| 2924 | ;; Optionally scroll so that the text | 2928 | (goto-char (point-max)) |
| 2925 | ;; ends at the bottom of the window. | 2929 | (recenter -1))))) |
| 2926 | (if (and term-scroll-show-maximum-output | 2930 | (not (eq win last-win)))) |
| 2927 | (>= (point) (process-mark proc))) | ||
| 2928 | (save-excursion | ||
| 2929 | (goto-char (point-max)) | ||
| 2930 | (recenter -1))))) | ||
| 2931 | (not (eq win last-win)))) | ||
| 2932 | 2931 | ||
| 2933 | ;;; Stolen from comint.el and adapted -mm | 2932 | ;;; Stolen from comint.el and adapted -mm |
| 2934 | (if (> term-buffer-maximum-size 0) | 2933 | (if (> term-buffer-maximum-size 0) |
| 2935 | (save-excursion | 2934 | (save-excursion |
| 2936 | (goto-char (process-mark (get-buffer-process (current-buffer)))) | 2935 | (goto-char (process-mark (get-buffer-process (current-buffer)))) |
| 2937 | (forward-line (- term-buffer-maximum-size)) | 2936 | (forward-line (- term-buffer-maximum-size)) |
| 2938 | (beginning-of-line) | 2937 | (beginning-of-line) |
| 2939 | (delete-region (point-min) (point)))) | 2938 | (delete-region (point-min) (point)))) |
| 2940 | ;;; | 2939 | ;;; |
| 2941 | 2940 | ||
| 2942 | (set-marker save-marker nil)) | 2941 | (set-marker save-marker nil))))) |
| 2943 | ;; unwind-protect cleanup-forms follow: | ||
| 2944 | (set-buffer previous-buffer) | ||
| 2945 | (select-window selected)))) | ||
| 2946 | 2942 | ||
| 2947 | (defun term-handle-deferred-scroll () | 2943 | (defun term-handle-deferred-scroll () |
| 2948 | (let ((count (- (term-current-row) term-height))) | 2944 | (let ((count (- (term-current-row) term-height))) |