aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard M. Stallman1995-01-22 02:21:32 +0000
committerRichard M. Stallman1995-01-22 02:21:32 +0000
commit7fee19128471fd594baac54c7ccee54b48d9ff32 (patch)
tree2cc6efde7ea52fc4224eed6b6dc49ba0c1985ab2
parent3e6eef952574d43b6eb6004a30ba02234bd4c13b (diff)
downloademacs-7fee19128471fd594baac54c7ccee54b48d9ff32.tar.gz
emacs-7fee19128471fd594baac54c7ccee54b48d9ff32.zip
(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.
-rw-r--r--lisp/term.el206
1 files changed, 125 insertions, 81 deletions
diff --git a/lisp/term.el b/lisp/term.el
index c672fca95f2..275c3b2b7da 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -1,5 +1,5 @@
1;; term.el --- general command interpreter in a window stuff 1;; term.el --- general command interpreter in a window stuff
2;; Copyright (C) 1988, 1990, 1992, 1992, 1994 Free Software Foundation, Inc. 2;; Copyright (C) 1988, 1990, 1992, 1994, 1995 Free Software Foundation, Inc.
3 3
4;; Author: Per Bothner <bothner@cygnus.com> 4;; Author: Per Bothner <bothner@cygnus.com>
5;; Based on comint mode written by: Olin Shivers <shivers@cs.cmu.edu> 5;; Based on comint mode written by: Olin Shivers <shivers@cs.cmu.edu>
@@ -82,7 +82,7 @@
82 82
83;;; This is passed to the inferior in the EMACS environment variable, 83;;; This is passed to the inferior in the EMACS environment variable,
84;;; so it is important to increase it if there are protocol-relevant changes. 84;;; so it is important to increase it if there are protocol-relevant changes.
85(defconst term-version "0.93") 85(defconst term-version "0.94")
86 86
87(require 'ring) 87(require 'ring)
88(require 'ehelp) 88(require 'ehelp)
@@ -268,26 +268,28 @@ Buffer local variable.")
268(put 'term-scroll-show-maximum-output 'permanent-local t) 268(put 'term-scroll-show-maximum-output 'permanent-local t)
269(put 'term-ptyp 'permanent-local t) 269(put 'term-ptyp 'permanent-local t)
270 270
271(defmacro term-is-emacs19 () '(string-match "^19" emacs-version)) 271;; Do FORMS if running under Emacs-19.
272;; True if running under XEmacs (perviously Lucid emacs). 272(defmacro term-if-emacs19 (&rest forms)
273 (if (string-match "^19" emacs-version) (cons 'progn forms)))
274;; True if running under XEmacs (previously Lucid emacs).
273(defmacro term-is-xemacs () '(string-match "Lucid" emacs-version)) 275(defmacro term-is-xemacs () '(string-match "Lucid" emacs-version))
276;; Do FORM if running under XEmacs (previously Lucid emacs).
277(defmacro term-if-xemacs (&rest forms)
278 (if (term-is-xemacs) (cons 'progn forms)))
279;; Do FORM if NOT running under XEmacs (previously Lucid emacs).
280(defmacro term-ifnot-xemacs (&rest forms)
281 (if (not (term-is-xemacs)) (cons 'progn forms)))
274 282
275(defmacro term-in-char-mode () '(eq (current-local-map) term-raw-map)) 283(defmacro term-in-char-mode () '(eq (current-local-map) term-raw-map))
276(defmacro term-in-line-mode () '(not (term-in-char-mode))) 284(defmacro term-in-line-mode () '(not (term-in-char-mode)))
277 285
278(if (term-is-xemacs) 286(term-if-xemacs
279 (defvar term-terminal-menu 287 (defvar term-terminal-menu
280 '("Terminal" 288 '("Terminal"
281 [ "Character mode" term-char-mode (term-in-line-mode)] 289 [ "Character mode" term-char-mode (term-in-line-mode)]
282 [ "Line mode" term-line-mode (term-in-char-mode)] 290 [ "Line mode" term-line-mode (term-in-char-mode)]
283 [ "Enable paging" term-pager-enable (not term-pager-count)] 291 [ "Enable paging" term-pager-toggle (not term-pager-count)]
284 [ "Disable paging" term-pager-disable term-pager-count])) 292 [ "Disable paging" term-pager-toggle term-pager-count])))
285)
286
287(put 'term-char-mode 'menu-enable '(term-in-line-mode))
288(put 'term-line-mode 'menu-enable '(term-in-char-mode))
289(put 'term-pager-enable 'menu-enable '(not term-pager-count))
290(put 'term-pager-disable 'menu-enable 'term-pager-count)
291 293
292(defun term-mode () 294(defun term-mode ()
293 "Major mode for interacting with an inferior interpreter. 295 "Major mode for interacting with an inferior interpreter.
@@ -429,9 +431,9 @@ Entry to this mode runs the hooks on term-mode-hook"
429 (make-local-variable 'term-chars-mode) 431 (make-local-variable 'term-chars-mode)
430 (setq term-chars-mode nil) 432 (setq term-chars-mode nil)
431 (run-hooks 'term-mode-hook) 433 (run-hooks 'term-mode-hook)
432 (if (term-is-xemacs) 434 (term-if-xemacs
433 (set-buffer-menubar 435 (set-buffer-menubar
434 (append current-menubar (list term-terminal-menu)))) 436 (append current-menubar (list term-terminal-menu))))
435 (or term-input-ring 437 (or term-input-ring
436 (setq term-input-ring (make-ring term-input-ring-size)))) 438 (setq term-input-ring (make-ring term-input-ring-size))))
437 439
@@ -442,10 +444,9 @@ Entry to this mode runs the hooks on term-mode-hook"
442 (define-key term-mode-map "\en" 'term-next-input) 444 (define-key term-mode-map "\en" 'term-next-input)
443 (define-key term-mode-map "\er" 'term-previous-matching-input) 445 (define-key term-mode-map "\er" 'term-previous-matching-input)
444 (define-key term-mode-map "\es" 'term-next-matching-input) 446 (define-key term-mode-map "\es" 'term-next-matching-input)
445 (if (term-is-xemacs) 447 (term-ifnot-xemacs
446 t 448 (define-key term-mode-map [?\A-\M-r] 'term-previous-matching-input-from-input)
447 (define-key term-mode-map [?\A-\M-r] 'term-previous-matching-input-from-input) 449 (define-key term-mode-map [?\A-\M-s] 'term-next-matching-input-from-input))
448 (define-key term-mode-map [?\A-\M-s] 'term-next-matching-input-from-input))
449 (define-key term-mode-map "\e\C-l" 'term-show-output) 450 (define-key term-mode-map "\e\C-l" 'term-show-output)
450 (define-key term-mode-map "\C-m" 'term-send-input) 451 (define-key term-mode-map "\C-m" 'term-send-input)
451 (define-key term-mode-map "\C-d" 'term-delchar-or-maybe-eof) 452 (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"
463 (define-key term-mode-map "\C-c\C-n" 'term-next-prompt) 464 (define-key term-mode-map "\C-c\C-n" 'term-next-prompt)
464 (define-key term-mode-map "\C-c\C-p" 'term-previous-prompt) 465 (define-key term-mode-map "\C-c\C-p" 'term-previous-prompt)
465 (define-key term-mode-map "\C-c\C-d" 'term-send-eof) 466 (define-key term-mode-map "\C-c\C-d" 'term-send-eof)
466 (define-key term-mode-map "\C-cc" 'term-char-mode) 467 (define-key term-mode-map "\C-c\C-k" 'term-char-mode)
467 (define-key term-mode-map "\C-cp" 'term-pager-enable) 468 (define-key term-mode-map "\C-c\C-j" 'term-line-mode)
468 (define-key term-mode-map "\C-cD" 'term-pager-disable) 469 (define-key term-mode-map "\C-c\C-q" 'term-pager-toggle)
469 470
470 (copy-face 'default 'term-underline-face) 471 (copy-face 'default 'term-underline-face)
471 (set-face-underline-p 'term-underline-face t) 472 (set-face-underline-p 'term-underline-face t)
@@ -487,21 +488,20 @@ Entry to this mode runs the hooks on term-mode-hook"
487 ) 488 )
488 489
489;; Menu bars: 490;; Menu bars:
490(if (and (not (boundp 'term-terminal-menu)) 491(term-ifnot-xemacs
491 (term-is-emacs19) (not (term-is-xemacs))) 492 (term-if-emacs19
492 (progn
493 ;; terminal: 493 ;; terminal:
494 (defvar term-terminal-menu (make-sparse-keymap "Terminal")) 494 (defvar term-terminal-menu (make-sparse-keymap "Terminal"))
495 (define-key term-mode-map [menu-bar terminal] 495 (define-key term-terminal-menu [terminal-pager-enable]
496 (cons "Terminal" term-terminal-menu)) 496 '("Enable paging" . term-fake-pager-enable))
497 (define-key term-terminal-menu [terminal-pager-disable]
498 '("Disable paging" . term-fake-pager-disable))
497 (define-key term-terminal-menu [terminal-char-mode] 499 (define-key term-terminal-menu [terminal-char-mode]
498 '("Character mode" . term-char-mode)) 500 '("Character mode" . term-char-mode))
499 (define-key term-terminal-menu [terminal-line-mode] 501 (define-key term-terminal-menu [terminal-line-mode]
500 '("Line mode" . term-line-mode)) 502 '("Line mode" . term-line-mode))
501 (define-key term-terminal-menu [terminal-pager-enable] 503 (define-key term-mode-map [menu-bar terminal]
502 '("Enable paging" . term-pager-enable)) 504 (setq term-terminal-menu (cons "Terminal" term-terminal-menu)))
503 (define-key term-terminal-menu [terminal-pager-disable]
504 '("Disable paging" . term-pager-disable))
505 505
506 ;; completion: (line mode only) 506 ;; completion: (line mode only)
507 (defvar term-completion-menu (make-sparse-keymap "Complete")) 507 (defvar term-completion-menu (make-sparse-keymap "Complete"))
@@ -557,14 +557,14 @@ Entry to this mode runs the hooks on term-mode-hook"
557 557
558 ;; Signals 558 ;; Signals
559 (defvar term-signals-menu (make-sparse-keymap "Signals")) 559 (defvar term-signals-menu (make-sparse-keymap "Signals"))
560 (define-key term-mode-map [menu-bar signals]
561 (cons "Signals" term-signals-menu))
562 (define-key term-signals-menu [eof] '("EOF" . term-send-eof)) 560 (define-key term-signals-menu [eof] '("EOF" . term-send-eof))
563 (define-key term-signals-menu [kill] '("KILL" . term-kill-subjob)) 561 (define-key term-signals-menu [kill] '("KILL" . term-kill-subjob))
564 (define-key term-signals-menu [quit] '("QUIT" . term-quit-subjob)) 562 (define-key term-signals-menu [quit] '("QUIT" . term-quit-subjob))
565 (define-key term-signals-menu [cont] '("CONT" . term-continue-subjob)) 563 (define-key term-signals-menu [cont] '("CONT" . term-continue-subjob))
566 (define-key term-signals-menu [stop] '("STOP" . term-stop-subjob)) 564 (define-key term-signals-menu [stop] '("STOP" . term-stop-subjob))
567 (define-key term-signals-menu [] '("BREAK" . term-interrupt-subjob)) 565 (define-key term-signals-menu [] '("BREAK" . term-interrupt-subjob))
566 (define-key term-mode-map [menu-bar signals]
567 (setq term-signals-menu (cons "Signals" term-signals-menu)))
568 )) 568 ))
569 569
570(defun term-reset-size (height width) 570(defun term-reset-size (height width)
@@ -670,13 +670,15 @@ without any interpretation."
670 (define-key term-raw-escape-map "\C-u" 670 (define-key term-raw-escape-map "\C-u"
671 (lookup-key (current-global-map) "\C-u")) 671 (lookup-key (current-global-map) "\C-u"))
672 (define-key term-raw-escape-map c 'term-send-raw) 672 (define-key term-raw-escape-map c 'term-send-raw)
673 (define-key term-raw-escape-map "p" 'term-pager-enable) 673 (define-key term-raw-escape-map "\C-q" 'term-pager-toggle)
674 (define-key term-raw-escape-map "D" 'term-pager-disable) 674 ;; The keybinding for term-char-mode is needed by the menubar code.
675 (define-key term-raw-escape-map "l" 'term-line-mode)) 675 (define-key term-raw-escape-map "\C-k" 'term-char-mode)
676 (define-key term-raw-escape-map "\C-j" 'term-line-mode))
676 677
677(defun term-char-mode () 678(defun term-char-mode ()
678 "Start using raw keyboard mode to send each character 679 "Switch to char (\"raw\") sub-mode of term mode.
679to inferior process until a key bound to term-line-mode is encountered." 680Each character you type is sent directly to the inferior without
681intervention from emacs, except for the escape character (usually C-c)."
680 (interactive) 682 (interactive)
681 (if (not term-raw-map) 683 (if (not term-raw-map)
682 (let* ((map (make-keymap)) 684 (let* ((map (make-keymap))
@@ -690,44 +692,49 @@ to inferior process until a key bound to term-line-mode is encountered."
690 (setq term-raw-map map) 692 (setq term-raw-map map)
691 (setq term-raw-escape-map 693 (setq term-raw-escape-map
692 (copy-keymap (lookup-key (current-global-map) "\C-x"))) 694 (copy-keymap (lookup-key (current-global-map) "\C-x")))
693 (if (term-is-emacs19) 695 (term-if-emacs19
694 (progn 696 (term-if-xemacs
695 (if (term-is-xemacs) 697 (define-key term-raw-map [(button2)] 'term-mouse-paste))
696 (define-key term-raw-map [(button2)] 'term-mouse-paste) 698 (term-ifnot-xemacs
697 (progn 699 (define-key term-raw-map [mouse-2] 'term-mouse-paste)
698 (define-key term-raw-map [mouse-2] 'term-mouse-paste) 700 (define-key term-raw-map [menu-bar terminal] term-terminal-menu)
699 (define-key term-raw-map [menu-bar terminal] 701 (define-key term-raw-map [menu-bar signals] term-signals-menu)
700 (cons "Terminal" term-terminal-menu)) 702 (define-key term-raw-map [up] 'term-send-up)
701 (define-key term-raw-map [menu-bar signals] 703 (define-key term-raw-map [down] 'term-send-down)
702 (cons "Signals" term-signals-menu)) )) 704 (define-key term-raw-map [right] 'term-send-right)
703 (define-key term-raw-map [up] 'term-send-up) 705 (define-key term-raw-map [left] 'term-send-left))
704 (define-key term-raw-map [down] 'term-send-down) 706 (term-set-escape-char ?\C-c))))
705 (define-key term-raw-map [right] 'term-send-right)
706 (define-key term-raw-map [left] 'term-send-left)))
707 (term-set-escape-char ?\C-c)))
708 ;; FIXME: Emit message? Cfr ilisp-raw-message 707 ;; FIXME: Emit message? Cfr ilisp-raw-message
709 (setq term-old-mode-map (current-local-map)) 708 (if (term-in-line-mode)
710 (use-local-map term-raw-map) 709 (progn
711 710 (setq term-old-mode-map (current-local-map))
712 ;; Send existing partial line to inferior (without newline). 711 (use-local-map term-raw-map)
713 (let ((pmark (process-mark (get-buffer-process (current-buffer)))) 712
714 (save-input-sender term-input-sender)) 713 ;; Send existing partial line to inferior (without newline).
715 (if (> (point) pmark) 714 (let ((pmark (process-mark (get-buffer-process (current-buffer))))
716 (unwind-protect 715 (save-input-sender term-input-sender))
717 (progn 716 (if (> (point) pmark)
718 (setq term-input-sender (symbol-function 'term-send-string)) 717 (unwind-protect
719 (end-of-line) 718 (progn
720 (term-send-input)) 719 (setq term-input-sender
721 (setq term-input-sender save-input-sender)))) 720 (symbol-function 'term-send-string))
722 721 (end-of-line)
723 (setq mode-line-process '(": char %s")) 722 (term-send-input))
724 (set-buffer-modified-p (buffer-modified-p))) ;;No-op, but updates mode line. 723 (setq term-input-sender save-input-sender))))
724
725 (setq mode-line-process '(": char %s"))
726 (set-buffer-modified-p (buffer-modified-p))))) ;; Updates mode line.
725 727
726(defun term-line-mode () 728(defun term-line-mode ()
729 "Switch to line (\"cooked\") sub-mode of term mode.
730This means that emacs editing commands work as normally, until
731you type \\[term-send-input] which sends the current line to the inferior."
727 (interactive) 732 (interactive)
728 (use-local-map term-old-mode-map) 733 (if (term-in-char-mode)
729 (setq mode-line-process '(": line %s")) 734 (progn
730 (set-buffer-modified-p (buffer-modified-p))) ;;No-op, but updates mode line. 735 (use-local-map term-old-mode-map)
736 (setq mode-line-process '(": line %s"))
737 (set-buffer-modified-p (buffer-modified-p))))) ;; Updates mode line.
731 738
732(defun term-check-proc (buffer) 739(defun term-check-proc (buffer)
733 "True if there is a process associated w/buffer BUFFER, and 740 "True if there is a process associated w/buffer BUFFER, and
@@ -2387,8 +2394,10 @@ The top-most line is line 0."
2387 (setq term-pending-frame (cons filename fileline)))) 2394 (setq term-pending-frame (cons filename fileline))))
2388 ((= (aref string 0) ?/) 2395 ((= (aref string 0) ?/)
2389 (cd (substring string 1))) 2396 (cd (substring string 1)))
2390 ((= (aref string 0) ?!) 2397 ;; Allowing the inferior to call functions in emacs is
2391 (eval (car (read-from-string string 1)))) 2398 ;; probably too big a security hole.
2399 ;; ((= (aref string 0) ?!)
2400 ;; (eval (car (read-from-string string 1))))
2392 (t)));; Otherwise ignore it 2401 (t)));; Otherwise ignore it
2393 2402
2394;; Make sure the file named TRUE-FILE is in a buffer that appears on the screen 2403;; 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."
2437(defun term-process-pager () 2446(defun term-process-pager ()
2438 (if (not term-pager-break-map) 2447 (if (not term-pager-break-map)
2439 (let* ((map (make-keymap)) 2448 (let* ((map (make-keymap))
2440 (i 0)) 2449 (i 0) tmp)
2441; (while (< i 128) 2450; (while (< i 128)
2442; (define-key map (make-string 1 i) 'term-send-raw) 2451; (define-key map (make-string 1 i) 'term-send-raw)
2443; (setq i (1+ i))) 2452; (setq i (1+ i)))
@@ -2457,6 +2466,27 @@ The top-most line is line 0."
2457 (define-key map "D" 'term-pager-disable) 2466 (define-key map "D" 'term-pager-disable)
2458 (define-key map "<" 'term-pager-bob) 2467 (define-key map "<" 'term-pager-bob)
2459 (define-key map ">" 'term-pager-eob) 2468 (define-key map ">" 'term-pager-eob)
2469
2470 ;; Add menu bar.
2471 (term-if-emacs19
2472 (term-ifnot-xemacs
2473 (define-key map [menu-bar terminal] term-terminal-menu)
2474 (define-key map [menu-bar signals] term-signals-menu)
2475 (setq tmp (make-sparse-keymap "More pages?"))
2476 (define-key tmp [help] '("Help" . term-pager-help))
2477 (define-key tmp [disable]
2478 '("Diable paging" . term-fake-pager-disable))
2479 (define-key tmp [discard]
2480 '("Discard remaining output" . term-pager-discard))
2481 (define-key tmp [eob] '("Goto to end" . term-pager-eob))
2482 (define-key tmp [bob] '("Goto to beginning" . term-pager-bob))
2483 (define-key tmp [line] '("1 line forwards" . term-pager-line))
2484 (define-key tmp [bline] '("1 line backwards" . term-pager-back-line))
2485 (define-key tmp [back] '("1 page backwards" . term-pager-back-page))
2486 (define-key tmp [page] '("1 page forwards" . term-pager-page))
2487 (define-key map [menu-bar page] (cons "More pages?" tmp))
2488 ))
2489
2460 (setq term-pager-break-map map))) 2490 (setq term-pager-break-map map)))
2461; (let ((process (get-buffer-process (current-buffer)))) 2491; (let ((process (get-buffer-process (current-buffer))))
2462; (stop-process process)) 2492; (stop-process process))
@@ -2468,7 +2498,8 @@ The top-most line is line 0."
2468 (list "-- **MORE** " 2498 (list "-- **MORE** "
2469 mode-line-buffer-identification 2499 mode-line-buffer-identification
2470 " [Type ? for help] " 2500 " [Type ? for help] "
2471 "%-"))) 2501 "%-"))
2502 (set-buffer-modified-p (buffer-modified-p))) ;;No-op, but updates mode line.
2472 2503
2473(defun term-pager-line (lines) 2504(defun term-pager-line (lines)
2474 (interactive "p") 2505 (interactive "p")
@@ -2535,6 +2566,18 @@ The top-most line is line 0."
2535 (or term-pager-count 2566 (or term-pager-count
2536 (setq term-pager-count 0))) ;; Or maybe set to (term-current-row) ?? 2567 (setq term-pager-count 0))) ;; Or maybe set to (term-current-row) ??
2537 2568
2569(defun term-pager-toggle ()
2570 (interactive)
2571 (if term-pager-count (term-pager-disable) (term-pager-enable)))
2572
2573(term-ifnot-xemacs
2574 (defalias 'term-fake-pager-enable 'term-pager-toggle)
2575 (defalias 'term-fake-pager-disable 'term-pager-toggle)
2576 (put 'term-char-mode 'menu-enable '(term-in-line-mode))
2577 (put 'term-line-mode 'menu-enable '(term-in-char-mode))
2578 (put 'term-fake-pager-enable 'menu-enable '(not term-pager-count))
2579 (put 'term-fake-pager-disable 'menu-enable 'term-pager-count))
2580
2538(defun term-pager-help () 2581(defun term-pager-help ()
2539 "Provide help on commands available in a terminal-emulator **MORE** break" 2582 "Provide help on commands available in a terminal-emulator **MORE** break"
2540 (interactive) 2583 (interactive)
@@ -2567,6 +2610,7 @@ all pending output has been dealt with."))
2567 (use-local-map term-pager-old-local-map) 2610 (use-local-map term-pager-old-local-map)
2568 (setq term-pager-old-local-map nil) 2611 (setq term-pager-old-local-map nil)
2569 (setq mode-line-format term-old-mode-line-format) 2612 (setq mode-line-format term-old-mode-line-format)
2613 (set-buffer-modified-p (buffer-modified-p)) ;; Updates mode line.
2570 (setq term-pager-count new-count) 2614 (setq term-pager-count new-count)
2571 (set-process-filter process term-pager-old-filter) 2615 (set-process-filter process term-pager-old-filter)
2572 (funcall term-pager-old-filter process "") 2616 (funcall term-pager-old-filter process "")