|
|
1.1 root 1: ;;
2: ;; copyright (C) 1987, 1988 Franz Inc, Berkeley, Ca.
3: ;;
4: ;; The software, data and information contained herein are the property
5: ;; of Franz, Inc.
6: ;;
7: ;; This file (or any derivation of it) may be distributed without
8: ;; further permission from Franz Inc. as long as:
9: ;;
10: ;; * it is not part of a product for sale,
11: ;; * no charge is made for the distribution, other than a tape
12: ;; fee, and
13: ;; * all copyright notices and this notice are preserved.
14: ;;
15: ;; If you have any comments or questions on this interface, please feel
16: ;; free to contact Franz Inc. at
17: ;; Franz Inc.
18: ;; Attn: Kevin Layer
19: ;; 1995 University Ave
20: ;; Suite 275
21: ;; Berkeley, CA 94704
22: ;; (415) 548-3600
23: ;; or
24: ;; emacs-info%[email protected]
25: ;; ucbvax!franz!emacs-info
26:
27: ;; $Header: rlogin.el,v 1.11 88/11/03 17:10:29 layer Exp $
28:
29: (defvar fi:rlogin-mode-map nil
30: "The rlogin major-mode keymap.")
31:
32: (defvar fi:rlogin-mode-super-key-map nil
33: "Used for super-key processing in rlogin mode.")
34:
35: (defvar fi:rlogin-image-name "rlogin"
36: "*Default remote-login image to invoke from (fi:rlogin). If the value
37: is a string then it names the image file or image path that
38: `fi:common-lisp' invokes. Otherwise, the value of this variable is given
39: to funcall, the result of which should yield a string which is the image
40: name or path.")
41:
42: (defvar fi:rlogin-image-arguments nil
43: "*Default remote-login image arguments when invoked from (fi:rlogin).")
44:
45: (defvar fi:rlogin-prompt-pattern
46: "^[-_.a-zA-Z0-9]*[#$%>] *"
47: "*Regexp used by Newline command in rlogin mode to match subshell prompts.
48: Anything from beginning of line up to the end of what this pattern matches
49: is deemed to be prompt, and is not re-executed.")
50:
51: (defvar fi:rlogin-initial-input "stty -echo nl\n"
52: "*The initial input sent to the rlogin subprocess, after the first prompt
53: is seen.")
54:
55: (defun fi:rlogin-mode ()
56: "Major mode for interacting with an inferior rlogin."
57: (interactive)
58: (kill-all-local-variables)
59: (setq major-mode 'fi:rlogin-mode)
60: (setq mode-name "Rlogin")
61:
62: (if (null fi:rlogin-mode-super-key-map)
63: (let ((map (make-sparse-keymap)))
64: (setq map (fi::subprocess-mode-super-keys map 'rlogin))
65: (define-key map "\C-z" 'fi:rlogin-send-stop)
66: (define-key map "\C-c" 'fi:rlogin-send-interrupt)
67: (define-key map "\C-d" 'fi:rlogin-send-eof)
68: (define-key map "\C-\\" 'fi:rlogin-send-quit)
69: (setq fi:rlogin-mode-super-key-map map)))
70:
71: (if (null fi:rlogin-mode-map)
72: (setq fi:rlogin-mode-map
73: (fi::subprocess-mode-commands (make-sparse-keymap)
74: fi:rlogin-mode-super-key-map
75: 'rlogin)))
76: (use-local-map fi:rlogin-mode-map)
77: (setq fi:subprocess-super-key-map fi:rlogin-mode-super-key-map)
78: (setq fi:shell-popd-regexp nil)
79: (setq fi:shell-pushd-regexp nil)
80: (setq fi:shell-cd-regexp nil)
81: (run-hooks 'fi:subprocess-mode-hook 'fi:rlogin-mode-hook))
82:
83: (defun fi:rlogin (&optional buffer-number host)
84: "Start an rlogin in a buffer whose name is determined from the optional
85: prefix argument BUFFER-NUMBER. Shell buffer names start with `*HOSTNAME'
86: and end with `*', with an optional `-N' in between. If BUFFER-NUMBER is
87: not given it defaults to 1. If BUFFER-NUMBER is >= 0, then the buffer is
88: named `*HOSTNAME-<BUFFER-NUMBER>*'. If BUFFER-NUMBER is < 0, then the first
89: available buffer name is chosen.
90:
91: The host name is read from the minibuffer.
92:
93: The image file and image arguments are taken from the variables
94: `fi:rlogin-image-name' and `fi:rlogin-image-arguments'.
95:
96: See fi:explicit-shell."
97: (interactive "p\nsRemote login to host: ")
98: (let ((proc
99: (fi::make-subprocess
100: buffer-number host 'fi:rlogin-mode
101: fi:rlogin-prompt-pattern
102: "env"
103: (append (list "TERM=dumb" fi:rlogin-image-name host)
104: fi:rlogin-image-arguments))))
105: (set-process-filter proc 'fi::rlogin-filter)
106: proc))
107:
108: (defun fi:explicit-rlogin (&optional buffer-number host
109: image-name image-arguments)
110: "The same as fi:rlogin, except that the image and image arguments
111: are read from the minibuffer."
112: (interactive
113: "p\nsRemote login to host: \nsImage name: \nxImage arguments (a list): ")
114: (let ((proc
115: (fi::make-subprocess
116: buffer-number host 'fi:rlogin-mode
117: fi:rlogin-prompt-pattern
118: "env"
119: (append (list "TERM=dumb" image-name host) image-arguments))))
120: (set-process-filter proc 'fi::rlogin-filter)
121: proc))
122:
123: (defun fi:rlogin-send-eof ()
124: "Send eof to process running through remote login subprocess buffer."
125: (interactive)
126: (send-string (get-buffer-process (current-buffer)) "\C-d"))
127:
128: (defun fi:rlogin-send-interrupt ()
129: "Send interrupt to process running through remote login subprocess buffer."
130: (interactive)
131: (send-string (get-buffer-process (current-buffer)) "\C-c"))
132:
133: (defun fi:rlogin-send-quit ()
134: "Send quit to process running through remote login subprocess buffer."
135: (interactive)
136: (send-string (get-buffer-process (current-buffer)) "\C-\\"))
137:
138: (defun fi:rlogin-send-stop ()
139: "Send stop to process running through remote login subprocess buffer."
140: (interactive)
141: (send-string (get-buffer-process (current-buffer)) "\C-z"))
142:
143: (defun fi::rlogin-filter (process output)
144: "Filter for `fi:rlogin' subprocess buffers.
145: Watch for the first shell prompt from the remote login, then send the
146: string bound to fi:rlogin-initial-input, and turn ourself off."
147: (let ((old-buffer (fi::subprocess-filter process output t)))
148: (if (save-excursion (beginning-of-line)
149: (looking-at subprocess-prompt-pattern))
150: (progn
151: (set-process-filter process 'fi::subprocess-filter)
152: (fi::send-string-split process fi:rlogin-initial-input nil)))
153: (if old-buffer
154: (set-buffer old-buffer))))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.