1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-23 10:34:07 +00:00

(term-version): Increased to 0.94.

(term-if-emacs19, term-if-xemacs, term-ifnot-xemacs):  New macros
to conditionalize at compile-time for different emacs versions.
(various places):  Use them (instead of term-is-XXXX).
(term-is-emacs19):  Removed, no longer needed.

Change keybindings to not use C-c LETTER, for
term-char-mode, term-line-mode.  Keybindings for term-pager-enable
and term-pager-disable replaced by one for term-pager-toggle.
(term-pager-toggle):  New function.

(term-fake-pager-enable, term-fake-pager-disable):
Define as aliases, so that menubar code will find proper keybindings.
(term-char-mode):  Make no-op if already in char mode.
(term-line-mode):  Make no-op if already in line mode.
(term-mode-map):  Add keybinding for no-op term-line-mode, so
code to display menubar keybindings doesn't lose it.  (Needed
as long as char-mode and line-mode share term-terminal-menu.)
(term-raw-escape-map):  Likewise for term-char-mode.
(term-char-mode, term-line-mode):  Better documentation strings.

 Added menubar for pager sub-mode.

(term-command-hook):  Disabled the feature that allowed
inferior to send a lisp command to emacs - too big a security hole.
This commit is contained in:
Richard M. Stallman 1995-01-22 02:21:32 +00:00
parent 3e6eef9525
commit 7fee191284

View File

@ -1,5 +1,5 @@
;; term.el --- general command interpreter in a window stuff
;; Copyright (C) 1988, 1990, 1992, 1992, 1994 Free Software Foundation, Inc.
;; Copyright (C) 1988, 1990, 1992, 1994, 1995 Free Software Foundation, Inc.
;; Author: Per Bothner <bothner@cygnus.com>
;; Based on comint mode written by: Olin Shivers <shivers@cs.cmu.edu>
@ -82,7 +82,7 @@
;;; This is passed to the inferior in the EMACS environment variable,
;;; so it is important to increase it if there are protocol-relevant changes.
(defconst term-version "0.93")
(defconst term-version "0.94")
(require 'ring)
(require 'ehelp)
@ -268,26 +268,28 @@ Buffer local variable.")
(put 'term-scroll-show-maximum-output 'permanent-local t)
(put 'term-ptyp 'permanent-local t)
(defmacro term-is-emacs19 () '(string-match "^19" emacs-version))
;; True if running under XEmacs (perviously Lucid emacs).
;; Do FORMS if running under Emacs-19.
(defmacro term-if-emacs19 (&rest forms)
(if (string-match "^19" 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).
(defmacro term-if-xemacs (&rest forms)
(if (term-is-xemacs) (cons 'progn forms)))
;; Do FORM if NOT running under XEmacs (previously Lucid emacs).
(defmacro term-ifnot-xemacs (&rest forms)
(if (not (term-is-xemacs)) (cons 'progn forms)))
(defmacro term-in-char-mode () '(eq (current-local-map) term-raw-map))
(defmacro term-in-line-mode () '(not (term-in-char-mode)))
(if (term-is-xemacs)
(defvar term-terminal-menu
'("Terminal"
[ "Character mode" term-char-mode (term-in-line-mode)]
[ "Line mode" term-line-mode (term-in-char-mode)]
[ "Enable paging" term-pager-enable (not term-pager-count)]
[ "Disable paging" term-pager-disable term-pager-count]))
)
(put 'term-char-mode 'menu-enable '(term-in-line-mode))
(put 'term-line-mode 'menu-enable '(term-in-char-mode))
(put 'term-pager-enable 'menu-enable '(not term-pager-count))
(put 'term-pager-disable 'menu-enable 'term-pager-count)
(term-if-xemacs
(defvar term-terminal-menu
'("Terminal"
[ "Character mode" term-char-mode (term-in-line-mode)]
[ "Line mode" term-line-mode (term-in-char-mode)]
[ "Enable paging" term-pager-toggle (not term-pager-count)]
[ "Disable paging" term-pager-toggle term-pager-count])))
(defun term-mode ()
"Major mode for interacting with an inferior interpreter.
@ -429,9 +431,9 @@ Entry to this mode runs the hooks on term-mode-hook"
(make-local-variable 'term-chars-mode)
(setq term-chars-mode nil)
(run-hooks 'term-mode-hook)
(if (term-is-xemacs)
(set-buffer-menubar
(append current-menubar (list term-terminal-menu))))
(term-if-xemacs
(set-buffer-menubar
(append current-menubar (list term-terminal-menu))))
(or term-input-ring
(setq term-input-ring (make-ring term-input-ring-size))))
@ -442,10 +444,9 @@ Entry to this mode runs the hooks on term-mode-hook"
(define-key term-mode-map "\en" 'term-next-input)
(define-key term-mode-map "\er" 'term-previous-matching-input)
(define-key term-mode-map "\es" 'term-next-matching-input)
(if (term-is-xemacs)
t
(define-key term-mode-map [?\A-\M-r] 'term-previous-matching-input-from-input)
(define-key term-mode-map [?\A-\M-s] 'term-next-matching-input-from-input))
(term-ifnot-xemacs
(define-key term-mode-map [?\A-\M-r] 'term-previous-matching-input-from-input)
(define-key term-mode-map [?\A-\M-s] 'term-next-matching-input-from-input))
(define-key term-mode-map "\e\C-l" 'term-show-output)
(define-key term-mode-map "\C-m" 'term-send-input)
(define-key term-mode-map "\C-d" 'term-delchar-or-maybe-eof)
@ -463,9 +464,9 @@ Entry to this mode runs the hooks on term-mode-hook"
(define-key term-mode-map "\C-c\C-n" 'term-next-prompt)
(define-key term-mode-map "\C-c\C-p" 'term-previous-prompt)
(define-key term-mode-map "\C-c\C-d" 'term-send-eof)
(define-key term-mode-map "\C-cc" 'term-char-mode)
(define-key term-mode-map "\C-cp" 'term-pager-enable)
(define-key term-mode-map "\C-cD" 'term-pager-disable)
(define-key term-mode-map "\C-c\C-k" 'term-char-mode)
(define-key term-mode-map "\C-c\C-j" 'term-line-mode)
(define-key term-mode-map "\C-c\C-q" 'term-pager-toggle)
(copy-face 'default 'term-underline-face)
(set-face-underline-p 'term-underline-face t)
@ -487,21 +488,20 @@ Entry to this mode runs the hooks on term-mode-hook"
)
;; Menu bars:
(if (and (not (boundp 'term-terminal-menu))
(term-is-emacs19) (not (term-is-xemacs)))
(progn
(term-ifnot-xemacs
(term-if-emacs19
;; terminal:
(defvar term-terminal-menu (make-sparse-keymap "Terminal"))
(define-key term-mode-map [menu-bar terminal]
(cons "Terminal" term-terminal-menu))
(define-key term-terminal-menu [terminal-pager-enable]
'("Enable paging" . term-fake-pager-enable))
(define-key term-terminal-menu [terminal-pager-disable]
'("Disable paging" . term-fake-pager-disable))
(define-key term-terminal-menu [terminal-char-mode]
'("Character mode" . term-char-mode))
(define-key term-terminal-menu [terminal-line-mode]
'("Line mode" . term-line-mode))
(define-key term-terminal-menu [terminal-pager-enable]
'("Enable paging" . term-pager-enable))
(define-key term-terminal-menu [terminal-pager-disable]
'("Disable paging" . term-pager-disable))
(define-key term-mode-map [menu-bar terminal]
(setq term-terminal-menu (cons "Terminal" term-terminal-menu)))
;; completion: (line mode only)
(defvar term-completion-menu (make-sparse-keymap "Complete"))
@ -557,14 +557,14 @@ Entry to this mode runs the hooks on term-mode-hook"
;; Signals
(defvar term-signals-menu (make-sparse-keymap "Signals"))
(define-key term-mode-map [menu-bar signals]
(cons "Signals" term-signals-menu))
(define-key term-signals-menu [eof] '("EOF" . term-send-eof))
(define-key term-signals-menu [kill] '("KILL" . term-kill-subjob))
(define-key term-signals-menu [quit] '("QUIT" . term-quit-subjob))
(define-key term-signals-menu [cont] '("CONT" . term-continue-subjob))
(define-key term-signals-menu [stop] '("STOP" . term-stop-subjob))
(define-key term-signals-menu [] '("BREAK" . term-interrupt-subjob))
(define-key term-mode-map [menu-bar signals]
(setq term-signals-menu (cons "Signals" term-signals-menu)))
))
(defun term-reset-size (height width)
@ -670,13 +670,15 @@ without any interpretation."
(define-key term-raw-escape-map "\C-u"
(lookup-key (current-global-map) "\C-u"))
(define-key term-raw-escape-map c 'term-send-raw)
(define-key term-raw-escape-map "p" 'term-pager-enable)
(define-key term-raw-escape-map "D" 'term-pager-disable)
(define-key term-raw-escape-map "l" 'term-line-mode))
(define-key term-raw-escape-map "\C-q" 'term-pager-toggle)
;; The keybinding for term-char-mode is needed by the menubar code.
(define-key term-raw-escape-map "\C-k" 'term-char-mode)
(define-key term-raw-escape-map "\C-j" 'term-line-mode))
(defun term-char-mode ()
"Start using raw keyboard mode to send each character
to inferior process until a key bound to term-line-mode is encountered."
"Switch to char (\"raw\") sub-mode of term mode.
Each character you type is sent directly to the inferior without
intervention from emacs, except for the escape character (usually C-c)."
(interactive)
(if (not term-raw-map)
(let* ((map (make-keymap))
@ -690,44 +692,49 @@ to inferior process until a key bound to term-line-mode is encountered."
(setq term-raw-map map)
(setq term-raw-escape-map
(copy-keymap (lookup-key (current-global-map) "\C-x")))
(if (term-is-emacs19)
(progn
(if (term-is-xemacs)
(define-key term-raw-map [(button2)] 'term-mouse-paste)
(progn
(define-key term-raw-map [mouse-2] 'term-mouse-paste)
(define-key term-raw-map [menu-bar terminal]
(cons "Terminal" term-terminal-menu))
(define-key term-raw-map [menu-bar signals]
(cons "Signals" term-signals-menu)) ))
(define-key term-raw-map [up] 'term-send-up)
(define-key term-raw-map [down] 'term-send-down)
(define-key term-raw-map [right] 'term-send-right)
(define-key term-raw-map [left] 'term-send-left)))
(term-set-escape-char ?\C-c)))
(term-if-emacs19
(term-if-xemacs
(define-key term-raw-map [(button2)] 'term-mouse-paste))
(term-ifnot-xemacs
(define-key term-raw-map [mouse-2] 'term-mouse-paste)
(define-key term-raw-map [menu-bar terminal] term-terminal-menu)
(define-key term-raw-map [menu-bar signals] term-signals-menu)
(define-key term-raw-map [up] 'term-send-up)
(define-key term-raw-map [down] 'term-send-down)
(define-key term-raw-map [right] 'term-send-right)
(define-key term-raw-map [left] 'term-send-left))
(term-set-escape-char ?\C-c))))
;; FIXME: Emit message? Cfr ilisp-raw-message
(setq term-old-mode-map (current-local-map))
(use-local-map term-raw-map)
(if (term-in-line-mode)
(progn
(setq term-old-mode-map (current-local-map))
(use-local-map term-raw-map)
;; Send existing partial line to inferior (without newline).
(let ((pmark (process-mark (get-buffer-process (current-buffer))))
(save-input-sender term-input-sender))
(if (> (point) pmark)
(unwind-protect
(progn
(setq term-input-sender (symbol-function 'term-send-string))
(end-of-line)
(term-send-input))
(setq term-input-sender save-input-sender))))
;; Send existing partial line to inferior (without newline).
(let ((pmark (process-mark (get-buffer-process (current-buffer))))
(save-input-sender term-input-sender))
(if (> (point) pmark)
(unwind-protect
(progn
(setq term-input-sender
(symbol-function 'term-send-string))
(end-of-line)
(term-send-input))
(setq term-input-sender save-input-sender))))
(setq mode-line-process '(": char %s"))
(set-buffer-modified-p (buffer-modified-p))) ;;No-op, but updates mode line.
(setq mode-line-process '(": char %s"))
(set-buffer-modified-p (buffer-modified-p))))) ;; Updates mode line.
(defun term-line-mode ()
"Switch to line (\"cooked\") sub-mode of term mode.
This means that emacs editing commands work as normally, until
you type \\[term-send-input] which sends the current line to the inferior."
(interactive)
(use-local-map term-old-mode-map)
(setq mode-line-process '(": line %s"))
(set-buffer-modified-p (buffer-modified-p))) ;;No-op, but updates mode line.
(if (term-in-char-mode)
(progn
(use-local-map term-old-mode-map)
(setq mode-line-process '(": line %s"))
(set-buffer-modified-p (buffer-modified-p))))) ;; Updates mode line.
(defun term-check-proc (buffer)
"True if there is a process associated w/buffer BUFFER, and
@ -2387,8 +2394,10 @@ The top-most line is line 0."
(setq term-pending-frame (cons filename fileline))))
((= (aref string 0) ?/)
(cd (substring string 1)))
((= (aref string 0) ?!)
(eval (car (read-from-string string 1))))
;; Allowing the inferior to call functions in emacs is
;; probably too big a security hole.
;; ((= (aref string 0) ?!)
;; (eval (car (read-from-string string 1))))
(t)));; Otherwise ignore it
;; Make sure the file named TRUE-FILE is in a buffer that appears on the screen
@ -2437,7 +2446,7 @@ The top-most line is line 0."
(defun term-process-pager ()
(if (not term-pager-break-map)
(let* ((map (make-keymap))
(i 0))
(i 0) tmp)
; (while (< i 128)
; (define-key map (make-string 1 i) 'term-send-raw)
; (setq i (1+ i)))
@ -2457,6 +2466,27 @@ The top-most line is line 0."
(define-key map "D" 'term-pager-disable)
(define-key map "<" 'term-pager-bob)
(define-key map ">" 'term-pager-eob)
;; Add menu bar.
(term-if-emacs19
(term-ifnot-xemacs
(define-key map [menu-bar terminal] term-terminal-menu)
(define-key map [menu-bar signals] term-signals-menu)
(setq tmp (make-sparse-keymap "More pages?"))
(define-key tmp [help] '("Help" . term-pager-help))
(define-key tmp [disable]
'("Diable paging" . term-fake-pager-disable))
(define-key tmp [discard]
'("Discard remaining output" . term-pager-discard))
(define-key tmp [eob] '("Goto to end" . term-pager-eob))
(define-key tmp [bob] '("Goto to beginning" . term-pager-bob))
(define-key tmp [line] '("1 line forwards" . term-pager-line))
(define-key tmp [bline] '("1 line backwards" . term-pager-back-line))
(define-key tmp [back] '("1 page backwards" . term-pager-back-page))
(define-key tmp [page] '("1 page forwards" . term-pager-page))
(define-key map [menu-bar page] (cons "More pages?" tmp))
))
(setq term-pager-break-map map)))
; (let ((process (get-buffer-process (current-buffer))))
; (stop-process process))
@ -2468,7 +2498,8 @@ The top-most line is line 0."
(list "-- **MORE** "
mode-line-buffer-identification
" [Type ? for help] "
"%-")))
"%-"))
(set-buffer-modified-p (buffer-modified-p))) ;;No-op, but updates mode line.
(defun term-pager-line (lines)
(interactive "p")
@ -2535,6 +2566,18 @@ The top-most line is line 0."
(or term-pager-count
(setq term-pager-count 0))) ;; Or maybe set to (term-current-row) ??
(defun term-pager-toggle ()
(interactive)
(if term-pager-count (term-pager-disable) (term-pager-enable)))
(term-ifnot-xemacs
(defalias 'term-fake-pager-enable 'term-pager-toggle)
(defalias 'term-fake-pager-disable 'term-pager-toggle)
(put 'term-char-mode 'menu-enable '(term-in-line-mode))
(put 'term-line-mode 'menu-enable '(term-in-char-mode))
(put 'term-fake-pager-enable 'menu-enable '(not term-pager-count))
(put 'term-fake-pager-disable 'menu-enable 'term-pager-count))
(defun term-pager-help ()
"Provide help on commands available in a terminal-emulator **MORE** break"
(interactive)
@ -2567,6 +2610,7 @@ all pending output has been dealt with."))
(use-local-map term-pager-old-local-map)
(setq term-pager-old-local-map nil)
(setq mode-line-format term-old-mode-line-format)
(set-buffer-modified-p (buffer-modified-p)) ;; Updates mode line.
(setq term-pager-count new-count)
(set-process-filter process term-pager-old-filter)
(funcall term-pager-old-filter process "")