|
|
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.