X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/37a44719526b4a38a828778bde5a632575e7b6e9..6a70ef0d8173b57817bcc8a013eb86c8583e74fc:/lisp/term.el diff --git a/lisp/term.el b/lisp/term.el index df70f7509c..5f68c4f171 100644 --- a/lisp/term.el +++ b/lisp/term.el @@ -4,7 +4,24 @@ ;;; Author: Per Bothner ;;; Based on comint mode written by: Olin Shivers -;;; Keyword: processes +;;; Keywords: processes + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. ;;; Dir/Hostname tracking and ANSI colorization by ;;; Marco Melgazzi . @@ -376,6 +393,8 @@ ;; so it is important to increase it if there are protocol-relevant changes. (defconst term-protocol-version "0.95") +(eval-when-compile + (require 'ange-ftp)) (require 'ring) (require 'ehelp) @@ -480,7 +499,7 @@ surrounding them, and also be regarded as arguments in their own right (unlike whitespace). See `term-arguments'. Defaults to the empty list. -For shells, a good value is (?\\| ?& ?< ?> ?\\( ?\\) ?;). +For shells, a good value is (?\\| ?& ?< ?> ?\\( ?\\) ?\\;). This is a good thing to set in mode hooks.") @@ -634,9 +653,10 @@ Buffer local variable.") (put 'term-scroll-show-maximum-output 'permanent-local t) (put 'term-ptyp 'permanent-local t) -;; Do FORMS if running under Emacs-19. +;; Do FORMS if running under Emacs 19 or later. (defmacro term-if-emacs19 (&rest forms) - (if (string-match "^19" emacs-version) (cons 'progn forms))) + (if (string-match "^\\(19\\|[2-9][0-9]\\)" emacs-version) + (cons 'progn forms))) ;; True if running under XEmacs (previously Lucid Emacs). (defmacro term-is-xemacs () '(string-match "Lucid" emacs-version)) ;; Do FORM if running under XEmacs (previously Lucid Emacs). @@ -691,16 +711,17 @@ Buffer local variable.") ;;; faces -mm -(defmacro term-ignore-error (body) +(defmacro term-ignore-error (&rest body) `(condition-case nil - (progn @,body) + (progn ,@body) (error nil))) -(defvar term-default-fg-color "SkyBlue") -(defvar term-default-bg-color "LightBlue") +(defvar term-default-fg-color nil) +(defvar term-default-bg-color nil) (when (fboundp 'make-face) ;;; --- Simple faces --- + (copy-face 'default 'term-default) (make-face 'term-default-fg) (make-face 'term-default-bg) (make-face 'term-default-fg-inv) @@ -1184,20 +1205,22 @@ without any interpretation." (defun term-send-raw-meta () (interactive) - (if (symbolp last-input-char) + (let ((char last-input-char)) + (when (symbolp last-input-char) ;; Convert `return' to C-m, etc. - (let ((tmp (get last-input-char 'event-symbol-elements))) - (if tmp - (setq last-input-char (car tmp))) - (if (symbolp last-input-char) - (progn - (setq tmp (get last-input-char 'ascii-character)) - (if tmp (setq last-input-char tmp)))))) - (term-send-raw-string (if (and (numberp last-input-char) - (> last-input-char 127) - (< last-input-char 256)) - (make-string 1 last-input-char) - (format "\e%c" last-input-char)))) + (let ((tmp (get char 'event-symbol-elements))) + (when tmp + (setq char (car tmp))) + (when (symbolp char) + (setq tmp (get char 'ascii-character)) + (when tmp + (setq char tmp))))) + (setq char (event-basic-type char)) + (term-send-raw-string (if (and (numberp char) + (> char 127) + (< char 256)) + (make-string 1 char) + (format "\e%c" char))))) (defun term-mouse-paste (click arg) "Insert the last stretch of killed text at the position clicked on." @@ -1222,8 +1245,8 @@ without any interpretation." (defun term-send-down () (interactive) (term-send-raw-string "\eOB")) (defun term-send-right () (interactive) (term-send-raw-string "\eOC")) (defun term-send-left () (interactive) (term-send-raw-string "\eOD")) -(defun term-send-home () (interactive) (term-send-raw-string "\e[H")) -(defun term-send-end () (interactive) (term-send-raw-string "\eOw")) +(defun term-send-home () (interactive) (term-send-raw-string "\e[1~")) +(defun term-send-end () (interactive) (term-send-raw-string "\e[4~")) (defun term-send-prior () (interactive) (term-send-raw-string "\e[5~")) (defun term-send-next () (interactive) (term-send-raw-string "\e[6~")) (defun term-send-del () (interactive) (term-send-raw-string "\C-?")) @@ -1431,7 +1454,10 @@ buffer. The hook term-exec-hook is run after each exec." (format "LINES=%d" term-height) (format "COLUMNS=%d" term-width)) process-environment)) - (process-connection-type t)) + (process-connection-type t) + ;; We should suppress conversion of end-of-line format. + (inhibit-eol-conversion t) + ) (apply 'start-process name buffer "/bin/sh" "-c" (format "stty -nl echo rows %d columns %d sane 2>/dev/null;\ @@ -1589,8 +1615,7 @@ See also `term-read-input-ring'." (defun term-regexp-arg (prompt) ;; Return list of regexp and prefix arg using PROMPT. - (let* ((minibuffer-history-sexp-flag nil) - ;; Don't clobber this. + (let* (;; Don't clobber this. (last-command last-command) (regexp (read-from-minibuffer prompt nil nil nil 'minibuffer-history-search-history))) @@ -2680,6 +2705,7 @@ See `term-prompt-regexp'." (let* ((previous-buffer (current-buffer)) (i 0) char funny count save-point save-marker old-point temp win (selected (selected-window)) + last-win (str-length (length str))) (unwind-protect (progn @@ -2874,7 +2900,7 @@ See `term-prompt-regexp'." (cond ((and (>= char ?0) (<= char ?9)) (setq term-terminal-parameter (+ (* 10 term-terminal-parameter) (- char ?0)))) - ((eq char ?\073 ) ; ?; + ((eq char ?\;) ;;; Some modifications to cope with multiple settings like ^[[01;32;43m -mm (setq term-terminal-more-parameters 1) (setq term-terminal-previous-parameter-4 @@ -2937,6 +2963,11 @@ See `term-prompt-regexp'." ;; Scroll each window displaying the buffer but (by default) ;; only if the point matches the process-mark we started with. (setq win selected) + ;; Avoid infinite loop in strange case where minibuffer window + ;; is selected but not active. + (while (window-minibuffer-p win) + (setq win (next-window win nil t))) + (setq last-win win) (while (progn (setq win (next-window win nil t)) (if (eq (window-buffer win) (process-buffer proc)) @@ -2962,7 +2993,7 @@ See `term-prompt-regexp'." (save-excursion (goto-char (point-max)) (recenter -1))))) - (not (eq win selected)))) + (not (eq win last-win)))) ;;; Stolen from comint.el and adapted -mm (if (> term-buffer-maximum-size 0) @@ -3014,12 +3045,22 @@ See `term-prompt-regexp'." ((eq parameter 8) (setq term-ansi-current-invisible 1)) +;;; Foreground ((and (>= parameter 30) (<= parameter 37)) (setq term-ansi-current-color (- parameter 29))) +;;; Reset foreground + ((eq parameter 39) + (setq term-ansi-current-color 0)) + +;;; Background ((and (>= parameter 40) (<= parameter 47)) (setq term-ansi-current-bg-color (- parameter 39))) +;;; Reset background + ((eq parameter 49) + (setq term-ansi-current-bg-color 0)) + ;;; 0 (Reset) or unknown (reset anyway) (t (setq term-current-face