mike@rice.ARPA (08/14/84)
From: Mike Caplinger <mike@rice.ARPA> ; visit and save remote files via the 4.2 BSD rcp command. ; copyright (c) 1984, Michael Caplinger ; Freely distribute to anyone. ; (rcp-visit-file hostname:filename) ; rcps the file into a file called (net-basename filename) ; in /tmp (so auto-execute will usually work), ; visits it, locally binds ^X^S and ^X^W to the ; remote equivalents, and deletes the temp file. If the file doesn't ; exist, it complains but leaves the buffer around and rebinds the ; save commands anyway. The tempfile has to have the name that it does so ; that auto-execute will work on it - an earlier version that did a read-file ; of a more innocuous file name didn't handle auto-execute correctly. ; The mode line of the buffer is massively hacked to make you believe ; the file you're editing is the one on the remote system. ; (rcp-write-file hostname:filename) saves the buffer's contents into a file ; called .rcpf in the current directory, rcps it to filename on the remote ; system, and deletes the temp file. rcp-write-named-file asks the user for ; the remote file name; it gives you the default if you just hit return. ; Note that in all cases, if filename isn't an absolute path name, it's ; relative to the user's home directory on the remote machine, as with rcp. ; BUGS: it doesn't act just like the file were local with a funny name. ; Filename completion doesn't exist. It doesn't make backup copies. ; .emacs_uid files say you're editing the non-existent temp file. ; Two people trying to access a remote file with the same basename at the ; same time are screwed. Oh well. ; If these bugs concern you (and they should), lobby harder for a real ; distributed file system at your site. (declare-buffer-specific *def-filename) (defun (rcp-visit-file filename machine tempname (setq filename (arg 1 ": rcp-visit-file ")) (setq tempname (concat "/tmp/" (net-basename filename))) (execute-monitor-command (concat "rcp " filename " " tempname)) (error-occurred (delete-buffer tempname)) (if (error-occurred (visit-file tempname)) (progn ; (delete-buffer (net-basename filename)) (message (concat "Couldn't find " filename)) ) (unlink-file tempname) ) (setq *def-filename filename) (setq mode-line-format (concat "Buffer: %b <remote> (%m) %p %* File: " filename)) (rcp-do-local-bindings) (novalue) ) (rcp-write-file (rcp-write-named-file *def-filename) ) (rcp-write-named-file filename (write-named-file ".rcpf") (setq filename (arg 1 (concat ": rcp-write-file [" *def-filename "] "))) (if (= filename "") (setq filename *def-filename) (setq *def-filename filename) ) (rcp-do-local-bindings) (setq mode-line-format (concat "Buffer: %b <remote> (%m) %p %* File: " filename)) (execute-monitor-command (concat "rcp .rcpf " filename)) (unlink-file ".rcpf") (message (concat "Wrote " filename ".")) (novalue) ) (rcp-do-local-bindings (local-bind-to-key "rcp-write-file" "\^X\^S") (local-bind-to-key "rcp-write-named-file" "\^X\^W") ) ) (defun ; net-basename takes a full pathname with slashes and colons and returns ; the last element of it; ie, ; "dione:/tmp/foo.t" => "foo.t" ; "dione:foo.t" => "foo.t" (net-basename *temp (save-window-excursion (pop-to-buffer "*scratch*") (insert-string (arg 1 ": full pathname ")) (end-of-file) (if (error-occurred (re-search-reverse "[:/]")) (beginning-of-file) (forward-character) ) (set-mark) (end-of-file) (setq *temp (region-to-string)) (delete-buffer "*scratch*") ) *temp ) )