;;; rlogin.el --- remote login interface
+;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+
;; Author: Noah Friedman
;; Maintainer: Noah Friedman <friedman@prep.ai.mit.edu>
;; Keywords: unix, comm
-;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
-;;
-;; This program is free software; you can redistribute it and/or modify
+;; This file is part of GNU Emacs.
+
+;; 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.
-;;
-;; This program is distributed in the hope that it will be useful,
+
+;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
-;;
+
;; You should have received a copy of the GNU General Public License
-;; along with this program; if not, write to: The Free Software Foundation,
-;; Inc.; 675 Massachusetts Avenue.; Cambridge, MA 02139, USA.
+;; 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.
-;; $Id: rlogin.el,v 1.25 1995/03/12 18:18:29 rms Exp friedman $
+;; $Id: rlogin.el,v 1.34 1996/06/20 17:30:41 friedman Exp friedman $
;;; Commentary:
\f
;;;###autoload (add-hook 'same-window-regexps "^\\*rlogin-.*\\*\\(\\|<[0-9]+>\\)")
+(defvar rlogin-history nil)
+
;;;###autoload
-(defun rlogin (input-args &optional prefix)
- "Open a network login connection to HOST via the `rlogin' program.
+(defun rlogin (input-args &optional buffer)
+ "Open a network login connection via `rlogin' with args INPUT-ARGS.
+INPUT-ARGS should start with a host name; it may also contain
+other arguments for `rlogin'.
+
Input is sent line-at-a-time to the remote connection.
Communication with the remote host is recorded in a buffer `*rlogin-HOST*'
If a prefix argument is given and the buffer `*rlogin-HOST*' already exists,
a new buffer with a different connection will be made.
+When called from a program, if the optional second argument BUFFER is
+a string or buffer, it specifies the buffer to use.
+
The variable `rlogin-program' contains the name of the actual program to
run. It can be a relative or absolute path.
function `rlogin-directory-tracking-mode' rather than simply setting the
variable."
(interactive (list
- (read-from-minibuffer "rlogin arguments (hostname first): ")
+ (read-from-minibuffer "rlogin arguments (hostname first): "
+ nil nil nil 'rlogin-history)
current-prefix-arg))
(let* ((process-connection-type rlogin-process-connection-type)
(format "*rlogin-%s@%s*" user host)))
proc)
- (cond ((null prefix))
- ((numberp prefix)
- (setq buffer-name (format "%s<%d>" buffer-name prefix)))
+ (cond ((null buffer))
+ ((stringp buffer)
+ (setq buffer-name buffer))
+ ((bufferp buffer)
+ (setq buffer-name (buffer-name buffer)))
+ ((numberp buffer)
+ (setq buffer-name (format "%s<%d>" buffer-name buffer)))
(t
(setq buffer-name (generate-new-buffer-name buffer-name))))
+ (setq buffer (get-buffer-create buffer-name))
(pop-to-buffer buffer-name)
+
(cond
((comint-check-proc buffer-name))
(t
- (comint-exec (current-buffer) buffer-name rlogin-program nil args)
- (setq proc (get-process buffer-name))
+ (comint-exec buffer buffer-name rlogin-program nil args)
+ (setq proc (get-buffer-process buffer))
;; Set process-mark to point-max in case there is text in the
;; buffer from a previous exited process.
(set-marker (process-mark proc) (point-max))
- (rlogin-mode)
;; comint-output-filter-functions is just like a hook, except that the
;; functions in that list are passed arguments. add-hook serves well
;; enough for modifying it.
+ ;; comint-output-filter-functions should already have a
+ ;; permanent-local property, at least in emacs 19.27 or later.
+ (if (fboundp 'make-local-hook)
+ (make-local-hook 'comint-output-filter-functions)
+ (make-local-variable 'comint-output-filter-functions))
(add-hook 'comint-output-filter-functions 'rlogin-carriage-filter)
+ (rlogin-mode)
+
(make-local-variable 'rlogin-host)
(setq rlogin-host host)
(make-local-variable 'rlogin-remote-user)
(setq rlogin-remote-user user)
- (cond
- ((eq rlogin-directory-tracking-mode t)
- ;; Do this here, rather than calling the tracking mode function, to
- ;; avoid a gratuitous resync check; the default should be the
- ;; user's home directory, be it local or remote.
- (setq comint-file-name-prefix
- (concat "/" rlogin-remote-user "@" rlogin-host ":"))
- (cd-absolute comint-file-name-prefix))
- ((null rlogin-directory-tracking-mode))
- (t
- (cd-absolute (concat comint-file-name-prefix "~/"))))))))
+ (condition-case ()
+ (cond ((eq rlogin-directory-tracking-mode t)
+ ;; Do this here, rather than calling the tracking mode
+ ;; function, to avoid a gratuitous resync check; the default
+ ;; should be the user's home directory, be it local or remote.
+ (setq comint-file-name-prefix
+ (concat "/" rlogin-remote-user "@" rlogin-host ":"))
+ (cd-absolute comint-file-name-prefix))
+ ((null rlogin-directory-tracking-mode))
+ (t
+ (cd-absolute (concat comint-file-name-prefix "~/"))))
+ (error nil))))))
(defun rlogin-mode ()
"Set major-mode for rlogin sessions.
((or (null prefix)
(consp prefix))
(setq rlogin-directory-tracking-mode t)
- (setq shell-dirtrack-p t)
+ (setq shell-dirtrackp t)
(setq comint-file-name-prefix
(concat "/" rlogin-remote-user "@" rlogin-host ":")))
((< prefix 0)
(setq rlogin-directory-tracking-mode nil)
- (setq shell-dirtrack-p nil))
+ (setq shell-dirtrackp nil))
(t
(setq rlogin-directory-tracking-mode 'local)
(setq comint-file-name-prefix "")
- (setq shell-dirtrack-p t)))
+ (setq shell-dirtrackp t)))
(cond
- (shell-dirtrack-p
+ (shell-dirtrackp
(let* ((proc (get-buffer-process (current-buffer)))
(proc-mark (process-mark proc))
(current-input (buffer-substring proc-mark (point-max)))