]> code.delx.au - gnu-emacs/blobdiff - lisp/terminal.el
Require rmail not just when compiling.
[gnu-emacs] / lisp / terminal.el
index 438f16906732d32211b344bebe4927a59f86639d..a015a91804755fd822b351e5cb17b5429ecb5816 100644 (file)
@@ -1,6 +1,7 @@
 ;;; terminal.el --- terminal emulator for GNU Emacs
 
-;; Copyright (C) 1986,87,88,89,93,94 Free Software Foundation, Inc.
+;; Copyright (C) 1986, 1987, 1988, 1989, 1993, 1994, 2001, 2002, 2003,
+;;   2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
 ;; Author: Richard Mlynarik <mly@eddie.mit.edu>
 ;; Maintainer: FSF
@@ -8,10 +9,10 @@
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; 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.
+;; the Free Software Foundation, either version 3 of the License, 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
@@ -19,9 +20,7 @@
 ;; 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.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
@@ -51,7 +50,7 @@
 
 
 (defcustom terminal-escape-char ?\C-^
-  "*All characters except for this are passed verbatim through the
+  "All characters except for this are passed verbatim through the
 terminal-emulator.  This character acts as a prefix for commands
 to the emulator program itself.  Type this character twice to send
 it through the emulator.  Type ? after typing it for a list of
@@ -61,7 +60,7 @@ This variable is local to each terminal-emulator buffer."
   :group 'terminal)
 
 (defcustom terminal-scrolling t ;;>> Setting this to t sort-of defeats my whole aim in writing this package...
-  "*If non-nil, the terminal-emulator will losingly `scroll' when output occurs
+  "If non-nil, the terminal-emulator will losingly `scroll' when output occurs
 past the bottom of the screen.  If nil, output will win and `wrap' to the top
 of the screen.
 This variable is local to each terminal-emulator buffer."
@@ -69,7 +68,7 @@ This variable is local to each terminal-emulator buffer."
   :group 'terminal)
 
 (defcustom terminal-more-processing t
-  "*If non-nil, do more-processing.
+  "If non-nil, do more-processing.
 This variable is local to each terminal-emulator buffer."
   :type 'boolean
   :group 'terminal)
@@ -78,7 +77,7 @@ This variable is local to each terminal-emulator buffer."
 ;; and expects to actually see anything, you should probably set this to
 ;; around 400
 (defcustom terminal-redisplay-interval 5000
-  "*Maximum number of characters which will be processed by the
+  "Maximum number of characters which will be processed by the
 terminal-emulator before a screen redisplay is forced.
 Set this to a large value for greater throughput,
 set it smaller for more frequent updates but overall slower
@@ -209,9 +208,13 @@ performance."
           (use-local-map terminal-escape-map)
           (setq s (read-key-sequence
                     (if current-prefix-arg
-                        (format "Emacs Terminal escape> %d "
+                        (format "Emacs Terminal escape[%s for help]> %d "
+                               (substitute-command-keys
+                                "\\<terminal-escape-map>\\[te-escape-help]")
                                 (prefix-numeric-value current-prefix-arg))
-                        "Emacs Terminal escape> "))))
+                        (format "Emacs Terminal escape[%s for help]> "
+                               (substitute-command-keys
+                                "\\<terminal-escape-map>\\[te-escape-help]"))))))
       (use-global-map global)
       (use-local-map local))
 
@@ -222,7 +225,7 @@ performance."
      ;;  you hit esc key...
      ((and (stringp s)
           (string= s (make-string 1 terminal-escape-char)))
-      (setq last-command-char terminal-escape-char)
+      (setq last-command-event terminal-escape-char)
       (let ((terminal-escape-char -259))
        (te-pass-through)))
 
@@ -393,10 +396,10 @@ set it smaller for more frequent updates (but overall slower performance."
 (put 'te-more-break-unread 'suppress-keymap t)
 (defun te-more-break-unread ()
   (interactive)
-  (if (eq last-input-char terminal-escape-char)
+  (if (eq last-input-event terminal-escape-char)
       (call-interactively 'te-escape)
     (message "Continuing from more break (\"%s\" typed, %d chars output pending...)"
-            (single-key-description last-input-char)
+            (single-key-description last-input-event)
             (te-pending-output-length))
     (setq te-more-count 259259)
     (te-more-break-unwind)
@@ -466,29 +469,29 @@ One characters is treated specially:
 the terminal escape character (normally C-^)
 lets you type a terminal emulator command."
   (interactive)
-  (cond ((eq last-input-char terminal-escape-char)
+  (cond ((eq last-input-event terminal-escape-char)
         (call-interactively 'te-escape))
        (t
         ;; Convert `return' to C-m, etc.
-        (if (and (symbolp last-input-char)
-                 (get last-input-char 'ascii-character))
-            (setq last-input-char (get last-input-char 'ascii-character)))
+        (if (and (symbolp last-input-event)
+                 (get last-input-event 'ascii-character))
+            (setq last-input-event (get last-input-event 'ascii-character)))
         ;; Convert meta characters to 8-bit form for transmission.
-        (if (and (integerp last-input-char)
-                 (not (zerop (logand last-input-char ?\M-\^@))))
-            (setq last-input-char (+ 128 (logand last-input-char 127))))
+        (if (and (integerp last-input-event)
+                 (not (zerop (logand last-input-event ?\M-\^@))))
+            (setq last-input-event (+ 128 (logand last-input-event 127))))
         ;; Now ignore all but actual characters.
         ;; (It ought to be possible to send through function
         ;; keys as character sequences if we add a description
         ;; to our termcap entry of what they should look like.)
-        (if (integerp last-input-char)
+        (if (integerp last-input-event)
             (progn
               (and terminal-more-processing (null (cdr te-pending-output))
                    (te-set-more-count nil))
-              (send-string te-process (make-string 1 last-input-char))
+              (process-send-string te-process (make-string 1 last-input-event))
               (te-process-output t))
           (message "Function key `%s' ignored"
-                   (single-key-description last-input-char))))))
+                   (single-key-description last-input-event))))))
 
 
 (defun te-set-window-start ()
@@ -533,7 +536,7 @@ together with a command \\<terminal-edit-map>to return to terminal emulation: \\
   (setq mode-name "Terminal Edit")
   (setq mode-line-modified (default-value 'mode-line-modified))
   (setq mode-line-process nil)
-  (run-hooks 'terminal-edit-mode-hook))
+  (run-mode-hooks 'terminal-edit-mode-hook))
 
 (defun te-edit ()
   "Start editing the terminal emulator buffer with ordinary Emacs commands."
@@ -562,10 +565,10 @@ together with a command \\<terminal-edit-map>to return to terminal emulation: \\
         (let ((p (point)))
           (cond ((search-forward "\n" (+ p width) 'move)
                  (forward-char -1)
-                 (insert-char ?\  (- width (- (point) p)))
+                 (insert-char ?\s (- width (- (point) p)))
                  (forward-char 1))
                 ((eobp)
-                 (insert-char ?\  (- width (- (point) p))))
+                 (insert-char ?\s (- width (- (point) p))))
                 ((= (following-char) ?\n)
                  (forward-char 1))
                 (t
@@ -637,7 +640,7 @@ together with a command \\<terminal-edit-map>to return to terminal emulation: \\
           (forward-char 1)
           (delete-region (point)
                          (+ (point) (length terminal-more-break-insertion)))
-          (insert-char ?\  te-width)
+          (insert-char ?\s te-width)
           (goto-char te-more-old-point)))
     (setq te-more-old-point nil)
     (let ((te-more-count 259259))
@@ -688,7 +691,7 @@ move to start of new line, clear to end of line."
                   (insert ?\n))))
     (forward-char 1)
     (delete-region (point) (+ (point) te-width)))
-  (insert-char ?\  te-width)
+  (insert-char ?\s te-width)
   (beginning-of-line)
   (te-set-window-start))
 
@@ -712,7 +715,7 @@ move to start of new line, clear to end of line."
   (save-excursion
     (let ((n (- (point) (progn (end-of-line) (point)))))
       (delete-region (point) (+ (point) n))
-      (insert-char ?\  (- n)))))
+      (insert-char ?\s (- n)))))
 
 
 ;; ^p C
@@ -722,7 +725,7 @@ move to start of new line, clear to end of line."
     (while (progn (end-of-line) (not (eobp)))
       (forward-char 1) (end-of-line)
       (delete-region (- (point) te-width) (point))
-      (insert-char ?\  te-width))))
+      (insert-char ?\s te-width))))
 
 
 ;; ^p ^l
@@ -732,7 +735,7 @@ move to start of new line, clear to end of line."
   (let ((i 0))
     (while (< i te-height)
       (setq i (1+ i))
-      (insert-char ?\  te-width)
+      (insert-char ?\s te-width)
       (insert ?\n)))
   (delete-region (1- (point-max)) (point-max))
   (goto-char (point-min))
@@ -745,13 +748,13 @@ move to start of new line, clear to end of line."
       ();(error "fooI")
     (save-excursion
       (let* ((line (- te-height (/ (- (point) (point-min)) (1+ te-width)) -1))
-            (n (min (- (te-get-char) ?\ ) line))
+            (n (min (- (te-get-char) ?\s) line))
             (i 0))
        (delete-region (- (point-max) (* n (1+ te-width))) (point-max))
        (if (eq (point) (point-max)) (insert ?\n))
        (while (< i n)
          (setq i (1+ i))
-         (insert-char ?\  te-width)
+         (insert-char ?\s te-width)
          (or (eq i line) (insert ?\n))))))
   (setq te-more-count -1))
 
@@ -761,7 +764,7 @@ move to start of new line, clear to end of line."
   (if (not (bolp))
       ();(error "fooD")
     (let* ((line (- te-height (/ (- (point) (point-min)) (1+ te-width)) -1))
-          (n (min (- (te-get-char) ?\ ) line))
+          (n (min (- (te-get-char) ?\s) line))
           (i 0))
       (delete-region (point)
                     (min (+ (point) (* n (1+ te-width))) (point-max)))
@@ -769,7 +772,7 @@ move to start of new line, clear to end of line."
        (goto-char (point-max))
        (while (< i n)
          (setq i (1+ i))
-         (insert-char ?\  te-width)
+         (insert-char ?\s te-width)
          (or (eq i line) (insert ?\n))))))
   (setq te-more-count -1))
 
@@ -793,7 +796,7 @@ move to start of new line, clear to end of line."
   (if (bolp)
       ()
     (delete-region (1- (point)) (point))
-    (insert ?\ )
+    (insert ?\s)
     (forward-char -1)))
 
 ;; ^p ^g
@@ -810,7 +813,7 @@ move to start of new line, clear to end of line."
        nil
       (delete-char (- n))
       (goto-char p)
-      (insert-char ?\  n))
+      (insert-char ?\s n))
     (goto-char p)))
 
 ;; ^p d count+32  (should be ^p ^d but cretinous un*x won't send ^d chars!!!)
@@ -820,7 +823,7 @@ move to start of new line, clear to end of line."
                 (- (progn (end-of-line) (point)) p))))
     (if (<= n 0)
        nil
-      (insert-char ?\  n)
+      (insert-char ?\s n)
       (goto-char p)
       (delete-char n))
     (goto-char p)))
@@ -857,7 +860,7 @@ move to start of new line, clear to end of line."
          (delete-char 1)
          (goto-char (point-max))
          (insert ?\n)
-         (insert-char ?\  te-width)
+         (insert-char ?\s te-width)
          (beginning-of-line))
       (forward-line 1))
     (move-to-column column))
@@ -1059,7 +1062,7 @@ move to start of new line, clear to end of line."
 ;; and it's apparently not needed in BSD.
 
 (defcustom explicit-shell-file-name nil
-  "*If non-nil, is file name to use for explicitly requested inferior shell."
+  "If non-nil, is file name to use for explicitly requested inferior shell."
   :type '(choice (const :tag "None" nil)
                 file)
   :group 'terminal)
@@ -1085,7 +1088,7 @@ This escape character may be changed using the variable `terminal-escape-char'.
 
 `Meta' characters may not currently be sent through the terminal emulator.
 
-Here is a list of some of the variables which control the behaviour
+Here is a list of some of the variables which control the behavior
 of the emulator -- see their documentation for more information:
 terminal-escape-char, terminal-scrolling, terminal-more-processing,
 terminal-redisplay-interval.
@@ -1110,7 +1113,7 @@ subprocess started."
                         (getenv "SHELL")
                         "/bin/sh"))
                   (s (read-string
-                      (format "Run program in emulator: (default %s) "
+                      (format "Run program in emulator (default %s): "
                               default-s))))
              (if (equal s "")
                  (list default-s '())
@@ -1157,7 +1160,7 @@ subprocess started."
   (setq inhibit-quit t)                        ;sport death
   (use-local-map terminal-map)
   (run-hooks 'terminal-mode-hook)
-  (message "Entering emacs terminal-emulator...  Type %s %s for help"
+  (message "Entering Emacs terminal-emulator...  Type %s %s for help"
           (single-key-description terminal-escape-char)
           (mapconcat 'single-key-description
                      (where-is-internal 'te-escape-help terminal-escape-map t)
@@ -1264,10 +1267,10 @@ of the terminal-emulator"
 (defun te-create-terminfo ()
   "Create and compile a terminfo entry for the virtual terminal. This is kept
 in the directory specified by `te-terminfo-directory'."
-  (if (and system-uses-terminfo
-          (not (file-exists-p (concat  te-terminfo-directory
-                                       (substring te-terminal-name-prefix 0 1)
-                                       "/" te-terminal-name))))
+  (when (and system-uses-terminfo
+            (not (file-exists-p (concat te-terminfo-directory
+                                        (substring te-terminal-name-prefix 0 1)
+                                        "/" te-terminal-name))))
     (let ( (terminfo
            (concat
             ;; The first newline avoids trouble with ncurses.
@@ -1278,24 +1281,30 @@ in the directory specified by `te-terminfo-directory'."
             "dch=^Pd%p1%'\\s'%+%c, dch1=^Pd!, dl=^P^K%p1%'\\s'%+%c,"
             "dl1=^P^K!, ed=^PC, el=^Pc, home=^P=\\s\\s,"
             "ich=^P_%p1%'\\s'%+%c, ich1=^P_!, il=^P^O%p1%'\\s'%+%c,"
+            ;; The last newline avoids trouble with ncurses.
             "il1=^P^O!, ind=^P\\n, nel=\\n,\n"))
-          ;; The last newline avoids trouble with ncurses.
+          ;; This is the desired name for the source file.
           (file-name (concat te-terminfo-directory te-terminal-name ".tif")) )
       (make-directory te-terminfo-directory t)
-      (save-excursion
-       (set-buffer (create-file-buffer file-name))
-       (insert terminfo)
-       (write-file file-name)
-       (kill-buffer nil)
-       )
-      (let ( (process-environment
-             (cons (concat "TERMINFO="
-                           (directory-file-name te-terminfo-directory))
-                   process-environment)) )
+      (let ((temp-file
+            (make-temp-file (expand-file-name "tif" te-terminfo-directory))))
+       ;; Store the source file under a random temp name.
+       (with-temp-file temp-file
+         (insert terminfo))
+       ;; Rename it to the desired name.
+       ;; We use this roundabout approach
+       ;; to avoid any risk of writing a name that
+       ;; was michievouslyt set up as a symlink.
+       (rename-file temp-file file-name))
+      ;; Now compile that source to make the binary that the
+      ;; programs actually use.
+      (let ((process-environment
+            (cons (concat "TERMINFO="
+                          (directory-file-name te-terminfo-directory))
+                  process-environment)))
        (set-process-sentinel (start-process "tic" nil "tic" file-name)
                              'te-tic-sentinel))))
-    (directory-file-name te-terminfo-directory)
-)
+    (directory-file-name te-terminfo-directory))
 
 (defun te-create-termcap ()
   "Create a termcap entry for the virtual terminal"
@@ -1335,4 +1344,5 @@ in the directory specified by `te-terminfo-directory'."
 
 (provide 'terminal)
 
+;; arch-tag: 0ae1d7d7-90ef-4566-a531-6e7ff8c79b2f
 ;;; terminal.el ends here