Each element looks like (REGEXP . DIRECTORY), with the same meaning like
in `backup-directory-alist'. If a Tramp file is backed up, and DIRECTORY
is a local file name, the backup directory is prepended with Tramp file
-name prefix \(method, user, host\) of file.
+name prefix \(method, user, host) of file.
-\(setq tramp-backup-directory-alist backup-directory-alist\)
+\(setq tramp-backup-directory-alist backup-directory-alist)
gives the same backup policy for Tramp files on their hosts like the
policy for local files."
It has the same meaning like `bkup-backup-directory-info' from package
`backup-dir'. If a Tramp file is backed up, and BACKUP-DIR is a local
file name, the backup directory is prepended with Tramp file name prefix
-\(method, user, host\) of file.
+\(method, user, host) of file.
-\(setq tramp-bkup-backup-directory-info bkup-backup-directory-info\)
+\(setq tramp-bkup-backup-directory-info bkup-backup-directory-info)
gives the same backup policy for Tramp files on their hosts like the
policy for local files."
(concat
"\\`"
(regexp-opt
- (list "localhost" "localhost6" (system-name) "127\.0\.0\.1" "::1") t)
+ (list "localhost" "localhost6" (system-name) "127.0.0.1" "::1") t)
"\\'")
"Host names which are regarded as local host.")
(defvar tramp-completion-function-alist nil
"Alist of methods for remote files.
-This is a list of entries of the form \(NAME PAIR1 PAIR2 ...\).
+This is a list of entries of the form \(NAME PAIR1 PAIR2 ...).
Each NAME stands for a remote access method. Each PAIR is of the form
-\(FUNCTION FILE\). FUNCTION is responsible to extract user names and host
+\(FUNCTION FILE). FUNCTION is responsible to extract user names and host
names from FILE for completion. The following predefined FUNCTIONs exists:
* `tramp-parse-rhosts' for \"~/.rhosts\" like files,
* `tramp-parse-netrc' for \"~/.netrc\" like files.
* `tramp-parse-putty' for PuTTY registered sessions.
-FUNCTION can also be a customer defined function. For more details see
+FUNCTION can also be a user defined function. For more details see
the info pages.")
(defconst tramp-echo-mark-marker "_echo"
files which are not really Tramp files.
Please note that the entry in `file-name-handler-alist' is made when
-this file \(tramp.el\) is loaded. This means that this variable must be set
+this file \(tramp.el) is loaded. This means that this variable must be set
before loading tramp.el. Alternatively, `file-name-handler-alist' can be
updated after changing this variable.
This regexp should match partial Tramp file names only.
Please note that the entry in `file-name-handler-alist' is made when
-this file \(tramp.el\) is loaded. This means that this variable must be set
+this file \(tramp.el) is loaded. This means that this variable must be set
before loading tramp.el. Alternatively, `file-name-handler-alist' can be
updated after changing this variable.
(erase-buffer)
(let ((proc (start-process (buffer-name) (current-buffer)
\"ssh\" \"-l\" user host \"wc\" \"-c\")))
- (when (memq (process-status proc) '(run open))
+ (when (memq (process-status proc) \\='(run open))
(process-send-string proc (make-string sent ?\\ ))
(process-send-eof proc)
(process-send-eof proc))
(while (not (progn (goto-char (point-min))
(re-search-forward \"\\\\w+\" (point-max) t)))
(accept-process-output proc 1))
- (when (memq (process-status proc) '(run open))
+ (when (memq (process-status proc) \\='(run open))
(setq received (string-to-number (match-string 0)))
(delete-process proc)
(message \"Bytes sent: %s\\tBytes received: %s\" sent received)
In the Emacs normally running Tramp, evaluate the above code
\(replace \"xxx\" and \"yyy\" by the remote user and host name,
-respectively\). You can do this, for example, by pasting it into
+respectively). You can do this, for example, by pasting it into
the `*scratch*' buffer and then hitting C-j with the cursor after the
last closing parenthesis. Note that it works only if you have configured
-\"ssh\" to run without password query, see ssh-agent\(1\).
+\"ssh\" to run without password query, see ssh-agent(1).
You will see the number of bytes sent successfully to the remote host.
If that number exceeds 1000, you can stop the execution by hitting
C-g, because your Emacs is likely clean.
When it is necessary to set `tramp-chunksize', you might consider to
-use an out-of-the-band method \(like \"scp\"\) instead of an internal one
-\(like \"ssh\"\), because setting `tramp-chunksize' to non-nil decreases
+use an out-of-the-band method \(like \"scp\") instead of an internal one
+\(like \"ssh\"), because setting `tramp-chunksize' to non-nil decreases
performance.
If your Emacs is buggy, the code stops and gives you an indication
(setcdr v (delete (car v) (cdr v))))
;; Check for function and file or registry key.
(unless (and (functionp (nth 0 (car v)))
- (if (string-match "^HKEY_CURRENT_USER" (nth 1 (car v)))
- ;; Windows registry.
- (and (memq system-type '(cygwin windows-nt))
- (zerop
- (tramp-call-process
- v "reg" nil nil nil "query" (nth 1 (car v)))))
- ;; Configuration file.
- (file-exists-p (nth 1 (car v)))))
+ (cond
+ ;; Windows registry.
+ ((string-match "^HKEY_CURRENT_USER" (nth 1 (car v)))
+ (and (memq system-type '(cygwin windows-nt))
+ (zerop
+ (tramp-call-process
+ v "reg" nil nil nil "query" (nth 1 (car v))))))
+ ;; Zeroconf service type.
+ ((string-match
+ "^_[[:alpha:]]+\\._[[:alpha:]]+$" (nth 1 (car v))))
+ ;; Configuration file.
+ (t (file-exists-p (nth 1 (car v))))))
(setq r (delete (car v) r)))
(setq v (cdr v)))
'dired-print-file 'dired-shell-call-process))
default-directory)
;; PROC.
- ((eq operation 'file-notify-rm-watch)
+ ((member operation (list 'file-notify-rm-watch 'file-notify-valid-p))
(when (processp (nth 0 args))
(with-current-buffer (process-buffer (nth 0 args))
default-directory)))
(and (file-directory-p filename)
(file-readable-p filename)))
+(defun tramp-handle-file-equal-p (filename1 filename2)
+ "Like `file-equalp-p' for Tramp files."
+ ;; Native `file-equalp-p' calls `file-truename', which requires a
+ ;; remote connection. This can be avoided, if FILENAME1 and
+ ;; FILENAME2 are not located on the same remote host.
+ (when (string-equal
+ (file-remote-p (expand-file-name filename1))
+ (file-remote-p (expand-file-name filename2)))
+ (tramp-run-real-handler 'file-equal-p (list filename1 filename2))))
+
(defun tramp-handle-file-exists-p (filename)
"Like `file-exists-p' for Tramp files."
(not (null (file-attributes filename))))
+(defun tramp-handle-file-in-directory-p (filename directory)
+ "Like `file-in-directory-p' for Tramp files."
+ ;; Native `file-in-directory-p' calls `file-truename', which
+ ;; requires a remote connection. This can be avoided, if FILENAME
+ ;; and DIRECTORY are not located on the same remote host.
+ (when (string-equal
+ (file-remote-p (expand-file-name filename))
+ (file-remote-p (expand-file-name directory)))
+ (tramp-run-real-handler 'file-in-directory-p (list filename directory))))
+
(defun tramp-handle-file-modes (filename)
"Like `file-modes' for Tramp files."
(let ((truename (or (file-truename filename) filename)))
(defun tramp-handle-file-notify-add-watch (filename _flags _callback)
"Like `file-notify-add-watch' for Tramp files."
;; This is the default handler. tramp-gvfs.el and tramp-sh.el have
- ;; its own one.
+ ;; their own one.
(setq filename (expand-file-name filename))
(with-parsed-tramp-file-name filename nil
(tramp-error
(unless (processp proc)
(tramp-error proc 'file-notify-error "Not a valid descriptor %S" proc))
(tramp-message proc 6 "Kill %S" proc)
- (kill-process proc))
+ (delete-process proc))
+
+(defun tramp-handle-file-notify-valid-p (proc)
+ "Like `file-notify-valid-p' for Tramp files."
+ (and proc (processp proc) (memq (process-status proc) '(run open))
+ ;; Sometimes, the process is still in status `run' when the
+ ;; file or directory to be watched is deleted already.
+ (with-current-buffer (process-buffer proc)
+ (file-exists-p
+ (concat (file-remote-p default-directory)
+ (tramp-compat-process-get proc 'watch-name))))))
;;; Functions for establishing connection:
(or (tramp-get-method-parameter vec 'tramp-tmpdir) "/tmp"))))
(with-tramp-connection-property vec "tmpdir"
(or (and (file-directory-p dir) (file-writable-p dir)
- (file-remote-p dir 'localname))
+ (tramp-file-name-handler 'file-remote-p dir 'localname))
(tramp-error vec 'file-error "Directory %s not accessible" dir)))
dir))
'tramp-delete-temp-file-function)))
;;; Auto saving to a special directory:
+(defvar auto-save-file-name-transforms)
(defun tramp-handle-make-auto-save-file-name ()
"Like `make-auto-save-file-name' for Tramp files.
Returns a file name in `tramp-auto-save-directory' for autosaving
this file, if that variable is non-nil."
+ (when (stringp tramp-auto-save-directory)
+ (setq tramp-auto-save-directory
+ (expand-file-name tramp-auto-save-directory)))
;; Create directory.
(unless (or (null tramp-auto-save-directory)
(file-exists-p tramp-auto-save-directory))
;;; TODO:
-;; * Rewrite `tramp-shell-quote-argument' to abstain from using
-;; `shell-quote-argument'.
;; * In Emacs 21, `insert-directory' shows total number of bytes used
;; by the files in that directory. Add this here.
;; * Avoid screen blanking when hitting `g' in dired. (Eli Tziperman)