emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/tramp 4d846b9: Tramp ELPA version 2.4.3 released


From: Michael Albinus
Subject: [elpa] externals/tramp 4d846b9: Tramp ELPA version 2.4.3 released
Date: Sun, 29 Dec 2019 06:00:12 -0500 (EST)

branch: externals/tramp
commit 4d846b94a06a6c76d57bc017305cac8042f1fe57
Author: Michael Albinus <address@hidden>
Commit: Michael Albinus <address@hidden>

    Tramp ELPA version 2.4.3 released
---
 test/tramp-tests.el  | 1251 +++++++++++++++++++++++++++-----------------------
 texi/tramp.texi      |   31 ++
 texi/trampver.texi   |    2 +-
 tramp-adb.el         |   10 +-
 tramp-cmds.el        |    2 +-
 tramp-compat.el      |    5 +
 tramp-integration.el |   79 +++-
 tramp-loaddefs.el    |    2 +-
 tramp-sh.el          |  180 ++++----
 tramp-smb.el         |    3 +-
 tramp.el             |   64 ++-
 tramp.info           |  157 ++++---
 trampver.el          |    7 +-
 13 files changed, 1036 insertions(+), 757 deletions(-)

diff --git a/test/tramp-tests.el b/test/tramp-tests.el
index 4b887e7..9cf466d 100644
--- a/test/tramp-tests.el
+++ b/test/tramp-tests.el
@@ -67,6 +67,14 @@
 (defvar tramp-remote-path)
 (defvar tramp-remote-process-environment)
 
+;; Needed for Emacs 24.
+(defvar inhibit-message)
+;; Needed for Emacs 25.
+(defvar connection-local-criteria-alist)
+(defvar connection-local-profile-alist)
+;; Needed for Emacs 26.
+(defvar async-shell-command-width)
+
 ;; Beautify batch mode.
 (when noninteractive
   ;; Suppress nasty messages.
@@ -221,79 +229,89 @@ properly.  BODY shall not contain a timeout."
 
 (ert-deftest tramp-test01-file-name-syntax ()
   "Check remote file name syntax."
-  ;; Simple cases.
-  (should (tramp-tramp-file-p "/method::"))
-  (should (tramp-tramp-file-p "/method:host:"))
-  (should (tramp-tramp-file-p "/method:user@:"))
-  (should (tramp-tramp-file-p "/method:user@host:"))
-  (should (tramp-tramp-file-p "/method:user@email@host:"))
-
-  ;; Using a port.
-  (should (tramp-tramp-file-p "/method:host#1234:"))
-  (should (tramp-tramp-file-p "/method:user@host#1234:"))
-
-  ;; Using an IPv4 address.
-  (should (tramp-tramp-file-p "/method:1.2.3.4:"))
-  (should (tramp-tramp-file-p "/method:user@1.2.3.4:"))
-
-  ;; Using an IPv6 address.
-  (should (tramp-tramp-file-p "/method:[::1]:"))
-  (should (tramp-tramp-file-p "/method:user@[::1]:"))
-
-  ;; Using an IPv4 mapped IPv6 address.
-  (should (tramp-tramp-file-p "/method:[::ffff:1.2.3.4]:"))
-  (should (tramp-tramp-file-p "/method:user@[::ffff:1.2.3.4]:"))
-
-  ;; Local file name part.
-  (should (tramp-tramp-file-p "/method:::"))
-  (should (tramp-tramp-file-p "/method::/:"))
-  (should (tramp-tramp-file-p "/method::/path/to/file"))
-  (should (tramp-tramp-file-p "/method::/:/path/to/file"))
-  (should (tramp-tramp-file-p "/method::file"))
-  (should (tramp-tramp-file-p "/method::/:file"))
-
-  ;; Multihop.
-  (should (tramp-tramp-file-p "/method1:|method2::"))
-  (should (tramp-tramp-file-p "/method1:host1|method2:host2:"))
-  (should (tramp-tramp-file-p "/method1:user1@host1|method2:user2@host2:"))
-  (should (tramp-tramp-file-p
-          "/method1:user1@host1|method2:user2@host2|method3:user3@host3:"))
-
-  ;; No strings.
-  (should-not (tramp-tramp-file-p nil))
-  (should-not (tramp-tramp-file-p 'symbol))
-  ;; No newline or linefeed.
-  (should-not (tramp-tramp-file-p "/method::file\nname"))
-  (should-not (tramp-tramp-file-p "/method::file\rname"))
-  ;; Ange-FTP syntax.
-  (should-not (tramp-tramp-file-p "/host:"))
-  (should-not (tramp-tramp-file-p "/user@host:"))
-  (should-not (tramp-tramp-file-p "/1.2.3.4:"))
-  (should-not (tramp-tramp-file-p "/[]:"))
-  (should-not (tramp-tramp-file-p "/[::1]:"))
-  (should-not (tramp-tramp-file-p "/[::ffff:1.2.3.4]:"))
-  (should-not (tramp-tramp-file-p "/host:/:"))
-  (should-not (tramp-tramp-file-p "/host1|host2:"))
-  (should-not (tramp-tramp-file-p "/user1@host1|user2@host2:"))
-  ;; Quote with "/:" suppresses file name handlers.
-  (should-not (tramp-tramp-file-p "/::"))
-  (should-not (tramp-tramp-file-p "/:@:"))
-  (should-not (tramp-tramp-file-p "/:[]:"))
-  ;; When `tramp-mode' is nil, Tramp is not activated.
-  (let (tramp-mode)
-    (should-not (tramp-tramp-file-p "/method:user@host:")))
-  ;; `tramp-ignored-file-name-regexp' suppresses Tramp.
-  (let ((tramp-ignored-file-name-regexp "^/method:user@host:"))
-    (should-not (tramp-tramp-file-p "/method:user@host:")))
-  ;; Methods shall be at least two characters on MS Windows, except
-  ;; the default method.
-  (let ((system-type 'windows-nt))
-    (should-not (tramp-tramp-file-p "/c:/path/to/file"))
-    (should-not (tramp-tramp-file-p "/c::/path/to/file"))
-    (should (tramp-tramp-file-p "/-::/path/to/file")))
-  (let ((system-type 'gnu/linux))
-    (should (tramp-tramp-file-p "/-:h:/path/to/file"))
-    (should (tramp-tramp-file-p "/m::/path/to/file"))))
+  (let ((syntax tramp-syntax))
+    (unwind-protect
+       (progn
+         (tramp-change-syntax 'default)
+         ;; Simple cases.
+         (should (tramp-tramp-file-p "/method::"))
+         (should (tramp-tramp-file-p "/method:host:"))
+         (should (tramp-tramp-file-p "/method:user@:"))
+         (should (tramp-tramp-file-p "/method:user@host:"))
+         (should (tramp-tramp-file-p "/method:user@email@host:"))
+
+         ;; Using a port.
+         (should (tramp-tramp-file-p "/method:host#1234:"))
+         (should (tramp-tramp-file-p "/method:user@host#1234:"))
+
+         ;; Using an IPv4 address.
+         (should (tramp-tramp-file-p "/method:1.2.3.4:"))
+         (should (tramp-tramp-file-p "/method:user@1.2.3.4:"))
+
+         ;; Using an IPv6 address.
+         (should (tramp-tramp-file-p "/method:[::1]:"))
+         (should (tramp-tramp-file-p "/method:user@[::1]:"))
+
+         ;; Using an IPv4 mapped IPv6 address.
+         (should (tramp-tramp-file-p "/method:[::ffff:1.2.3.4]:"))
+         (should (tramp-tramp-file-p "/method:user@[::ffff:1.2.3.4]:"))
+
+         ;; Local file name part.
+         (should (tramp-tramp-file-p "/method:::"))
+         (should (tramp-tramp-file-p "/method::/:"))
+         (should (tramp-tramp-file-p "/method::/path/to/file"))
+         (should (tramp-tramp-file-p "/method::/:/path/to/file"))
+         (should (tramp-tramp-file-p "/method::file"))
+         (should (tramp-tramp-file-p "/method::/:file"))
+
+         ;; Multihop.
+         (should (tramp-tramp-file-p "/method1:|method2::"))
+         (should
+          (tramp-tramp-file-p "/method1:host1|method2:host2:"))
+         (should
+          (tramp-tramp-file-p "/method1:user1@host1|method2:user2@host2:"))
+         (should
+          (tramp-tramp-file-p
+           "/method1:user1@host1|method2:user2@host2|method3:user3@host3:"))
+
+         ;; No strings.
+         (should-not (tramp-tramp-file-p nil))
+         (should-not (tramp-tramp-file-p 'symbol))
+         ;; No newline or linefeed.
+         (should-not (tramp-tramp-file-p "/method::file\nname"))
+         (should-not (tramp-tramp-file-p "/method::file\rname"))
+         ;; Ange-FTP syntax.
+         (should-not (tramp-tramp-file-p "/host:"))
+         (should-not (tramp-tramp-file-p "/user@host:"))
+         (should-not (tramp-tramp-file-p "/1.2.3.4:"))
+         (should-not (tramp-tramp-file-p "/[]:"))
+         (should-not (tramp-tramp-file-p "/[::1]:"))
+         (should-not (tramp-tramp-file-p "/[::ffff:1.2.3.4]:"))
+         (should-not (tramp-tramp-file-p "/host:/:"))
+         (should-not (tramp-tramp-file-p "/host1|host2:"))
+         (should-not (tramp-tramp-file-p "/user1@host1|user2@host2:"))
+         ;; Quote with "/:" suppresses file name handlers.
+         (should-not (tramp-tramp-file-p "/::"))
+         (should-not (tramp-tramp-file-p "/:@:"))
+         (should-not (tramp-tramp-file-p "/:[]:"))
+         ;; When `tramp-mode' is nil, Tramp is not activated.
+         (let (tramp-mode)
+           (should-not (tramp-tramp-file-p "/method:user@host:")))
+         ;; `tramp-ignored-file-name-regexp' suppresses Tramp.
+         (let ((tramp-ignored-file-name-regexp "^/method:user@host:"))
+           (should-not (tramp-tramp-file-p "/method:user@host:")))
+         ;; Methods shall be at least two characters on MS Windows,
+         ;; except the default method.
+         (let ((system-type 'windows-nt))
+           (should-not (tramp-tramp-file-p "/c:/path/to/file"))
+           (should-not (tramp-tramp-file-p "/c::/path/to/file"))
+           (should (tramp-tramp-file-p "/-::/path/to/file")))
+         (let ((system-type 'gnu/linux))
+           (should (tramp-tramp-file-p "/-:h:/path/to/file"))
+           (should (tramp-tramp-file-p "/m::/path/to/file"))))
+
+      ;; Exit.
+      (tramp-change-syntax syntax))))
 
 (ert-deftest tramp-test01-file-name-syntax-simplified ()
   "Check simplified file name syntax."
@@ -424,442 +442,499 @@ properly.  BODY shall not contain a timeout."
        (non-essential t)
        ;; Suppress check for multihops.
        (tramp-cache-data (make-hash-table :test #'equal))
-       (tramp-connection-properties '((nil "login-program" t))))
-    ;; An unknown method shall raise an error.
-    (let (non-essential)
-      (should-error
-       (expand-file-name "/method:user@host:")
-       :type 'user-error))
-
-    ;; Expand `tramp-default-user' and `tramp-default-host'.
-    (should (string-equal
-            (file-remote-p "/method::")
-            (format "/%s:%s@%s:" "method" "default-user" "default-host")))
-    (should (string-equal (file-remote-p "/method::" 'method) "method"))
-    (should (string-equal (file-remote-p "/method::" 'user) "default-user"))
-    (should (string-equal (file-remote-p "/method::" 'host) "default-host"))
-    (should (string-equal (file-remote-p "/method::" 'localname) ""))
-    (should (string-equal (file-remote-p "/method::" 'hop) nil))
-
-    ;; Expand `tramp-default-method' and `tramp-default-user'.
-    (should (string-equal
-            (file-remote-p "/-:host:")
-            (format "/%s:%s@%s:" "default-method" "default-user" "host")))
-    (should (string-equal (file-remote-p "/-:host:" 'method) "default-method"))
-    (should (string-equal (file-remote-p "/-:host:" 'user) "default-user"))
-    (should (string-equal (file-remote-p "/-:host:" 'host) "host"))
-    (should (string-equal (file-remote-p "/-:host:" 'localname) ""))
-    (should (string-equal (file-remote-p "/-:host:" 'hop) nil))
-
-    ;; Expand `tramp-default-method' and `tramp-default-host'.
-    (should (string-equal
-            (file-remote-p "/-:user@:")
-            (format "/%s:%s@%s:" "default-method" "user" "default-host")))
-    (should (string-equal (file-remote-p "/-:user@:" 'method) 
"default-method"))
-    (should (string-equal (file-remote-p "/-:user@:" 'user) "user"))
-    (should (string-equal (file-remote-p "/-:user@:" 'host) "default-host"))
-    (should (string-equal (file-remote-p "/-:user@:" 'localname) ""))
-    (should (string-equal (file-remote-p "/-:user@:" 'hop) nil))
-
-    ;; Expand `tramp-default-method'.
-    (should (string-equal
-            (file-remote-p "/-:user@host:")
-            (format "/%s:%s@%s:" "default-method" "user" "host")))
-    (should (string-equal
-            (file-remote-p "/-:user@host:" 'method) "default-method"))
-    (should (string-equal (file-remote-p "/-:user@host:" 'user) "user"))
-    (should (string-equal (file-remote-p "/-:user@host:" 'host) "host"))
-    (should (string-equal (file-remote-p "/-:user@host:" 'localname) ""))
-    (should (string-equal (file-remote-p "/-:user@host:" 'hop) nil))
-
-    ;; Expand `tramp-default-user'.
-    (should (string-equal
-            (file-remote-p "/method:host:")
-            (format "/%s:%s@%s:" "method" "default-user" "host")))
-    (should (string-equal (file-remote-p "/method:host:" 'method) "method"))
-    (should (string-equal (file-remote-p "/method:host:" 'user) 
"default-user"))
-    (should (string-equal (file-remote-p "/method:host:" 'host) "host"))
-    (should (string-equal (file-remote-p "/method:host:" 'localname) ""))
-    (should (string-equal (file-remote-p "/method:host:" 'hop) nil))
-
-    ;; Expand `tramp-default-host'.
-    (should (string-equal
-            (file-remote-p "/method:user@:")
-            (format "/%s:%s@%s:" "method" "user" "default-host")))
-    (should (string-equal (file-remote-p "/method:user@:" 'method) "method"))
-    (should (string-equal (file-remote-p "/method:user@:" 'user) "user"))
-    (should (string-equal (file-remote-p "/method:user@:" 'host)
-                         "default-host"))
-    (should (string-equal (file-remote-p "/method:user@:" 'localname) ""))
-    (should (string-equal (file-remote-p "/method:user@:" 'hop) nil))
-
-    ;; No expansion.
-    (should (string-equal
-            (file-remote-p "/method:user@host:")
-            (format "/%s:%s@%s:" "method" "user" "host")))
-    (should (string-equal
-            (file-remote-p "/method:user@host:" 'method) "method"))
-    (should (string-equal (file-remote-p "/method:user@host:" 'user) "user"))
-    (should (string-equal (file-remote-p "/method:user@host:" 'host) "host"))
-    (should (string-equal (file-remote-p "/method:user@host:" 'localname) ""))
-    (should (string-equal (file-remote-p "/method:user@host:" 'hop) nil))
-
-    ;; No expansion.
-    (should (string-equal
-            (file-remote-p "/method:user@email@host:")
-            (format "/%s:%s@%s:" "method" "user@email" "host")))
-    (should (string-equal
-            (file-remote-p "/method:user@email@host:" 'method) "method"))
-    (should (string-equal
-            (file-remote-p "/method:user@email@host:" 'user) "user@email"))
-    (should (string-equal
-            (file-remote-p "/method:user@email@host:" 'host) "host"))
-    (should (string-equal
-            (file-remote-p "/method:user@email@host:" 'localname) ""))
-    (should (string-equal
-            (file-remote-p "/method:user@email@host:" 'hop) nil))
-
-    ;; Expand `tramp-default-method' and `tramp-default-user'.
-    (should (string-equal
-            (file-remote-p "/-:host#1234:")
-            (format "/%s:%s@%s:" "default-method" "default-user" "host#1234")))
-    (should (string-equal
-            (file-remote-p "/-:host#1234:" 'method) "default-method"))
-    (should (string-equal (file-remote-p "/-:host#1234:" 'user) 
"default-user"))
-    (should (string-equal (file-remote-p "/-:host#1234:" 'host) "host#1234"))
-    (should (string-equal (file-remote-p "/-:host#1234:" 'localname) ""))
-    (should (string-equal (file-remote-p "/-:host#1234:" 'hop) nil))
-
-    ;; Expand `tramp-default-method'.
-    (should (string-equal
-            (file-remote-p "/-:user@host#1234:")
-            (format "/%s:%s@%s:" "default-method" "user" "host#1234")))
-    (should (string-equal
-            (file-remote-p "/-:user@host#1234:" 'method) "default-method"))
-    (should (string-equal (file-remote-p "/-:user@host#1234:" 'user) "user"))
-    (should (string-equal
-            (file-remote-p "/-:user@host#1234:" 'host) "host#1234"))
-    (should (string-equal (file-remote-p "/-:user@host#1234:" 'localname) ""))
-    (should (string-equal (file-remote-p "/-:user@host#1234:" 'hop) nil))
-
-    ;; Expand `tramp-default-user'.
-    (should (string-equal
-            (file-remote-p "/method:host#1234:")
-            (format "/%s:%s@%s:" "method" "default-user" "host#1234")))
-    (should (string-equal
-            (file-remote-p "/method:host#1234:" 'method) "method"))
-    (should (string-equal
-            (file-remote-p "/method:host#1234:" 'user) "default-user"))
-    (should (string-equal
-            (file-remote-p "/method:host#1234:" 'host) "host#1234"))
-    (should (string-equal (file-remote-p "/method:host#1234:" 'localname) ""))
-    (should (string-equal (file-remote-p "/method:host#1234:" 'hop) nil))
-
-    ;; No expansion.
-    (should (string-equal
-            (file-remote-p "/method:user@host#1234:")
-            (format "/%s:%s@%s:" "method" "user" "host#1234")))
-    (should (string-equal
-            (file-remote-p "/method:user@host#1234:" 'method) "method"))
-    (should (string-equal
-            (file-remote-p "/method:user@host#1234:" 'user) "user"))
-    (should (string-equal
-            (file-remote-p "/method:user@host#1234:" 'host) "host#1234"))
-    (should (string-equal
-            (file-remote-p "/method:user@host#1234:" 'localname) ""))
-    (should (string-equal
-            (file-remote-p "/method:user@host#1234:" 'hop) nil))
-
-    ;; Expand `tramp-default-method' and `tramp-default-user'.
-    (should (string-equal
-            (file-remote-p "/-:1.2.3.4:")
-            (format "/%s:%s@%s:" "default-method" "default-user" "1.2.3.4")))
-    (should (string-equal
-            (file-remote-p "/-:1.2.3.4:" 'method) "default-method"))
-    (should (string-equal (file-remote-p "/-:1.2.3.4:" 'user) "default-user"))
-    (should (string-equal (file-remote-p "/-:1.2.3.4:" 'host) "1.2.3.4"))
-    (should (string-equal (file-remote-p "/-:1.2.3.4:" 'localname) ""))
-    (should (string-equal (file-remote-p "/-:1.2.3.4:" 'hop) nil))
-
-    ;; Expand `tramp-default-method'.
-    (should (string-equal
-            (file-remote-p "/-:user@1.2.3.4:")
-            (format "/%s:%s@%s:" "default-method" "user" "1.2.3.4")))
-    (should (string-equal
-            (file-remote-p "/-:user@1.2.3.4:" 'method) "default-method"))
-    (should (string-equal (file-remote-p "/-:user@1.2.3.4:" 'user) "user"))
-    (should (string-equal (file-remote-p "/-:user@1.2.3.4:" 'host) "1.2.3.4"))
-    (should (string-equal (file-remote-p "/-:user@1.2.3.4:" 'localname) ""))
-    (should (string-equal (file-remote-p "/-:user@1.2.3.4:" 'hop) nil))
-
-    ;; Expand `tramp-default-user'.
-    (should (string-equal
-            (file-remote-p "/method:1.2.3.4:")
-            (format "/%s:%s@%s:" "method" "default-user" "1.2.3.4")))
-    (should (string-equal (file-remote-p "/method:1.2.3.4:" 'method) "method"))
-    (should (string-equal
-            (file-remote-p "/method:1.2.3.4:" 'user) "default-user"))
-    (should (string-equal (file-remote-p "/method:1.2.3.4:" 'host) "1.2.3.4"))
-    (should (string-equal (file-remote-p "/method:1.2.3.4:" 'localname) ""))
-    (should (string-equal (file-remote-p "/method:1.2.3.4:" 'hop) nil))
-
-    ;; No expansion.
-    (should (string-equal
-            (file-remote-p "/method:user@1.2.3.4:")
-            (format "/%s:%s@%s:" "method" "user" "1.2.3.4")))
-    (should (string-equal
-            (file-remote-p "/method:user@1.2.3.4:" 'method) "method"))
-    (should (string-equal (file-remote-p "/method:user@1.2.3.4:" 'user) 
"user"))
-    (should (string-equal
-            (file-remote-p "/method:user@1.2.3.4:" 'host) "1.2.3.4"))
-    (should (string-equal
-            (file-remote-p "/method:user@1.2.3.4:" 'localname) ""))
-    (should (string-equal
-            (file-remote-p "/method:user@1.2.3.4:" 'hop) nil))
-
-    ;; Expand `tramp-default-method', `tramp-default-user' and
-    ;; `tramp-default-host'.
-    (should (string-equal
-            (file-remote-p "/-:[]:")
-            (format
-             "/%s:%s@%s:" "default-method" "default-user" "default-host")))
-    (should (string-equal (file-remote-p "/-:[]:" 'method) "default-method"))
-    (should (string-equal (file-remote-p "/-:[]:" 'user) "default-user"))
-    (should (string-equal (file-remote-p "/-:[]:" 'host) "default-host"))
-    (should (string-equal (file-remote-p "/-:[]:" 'localname) ""))
-    (should (string-equal (file-remote-p "/-:[]:" 'hop) nil))
-
-    ;; Expand `tramp-default-method' and `tramp-default-user'.
-    (let ((tramp-default-host "::1"))
-      (should (string-equal
-              (file-remote-p "/-:[]:")
-              (format "/%s:%s@%s:" "default-method" "default-user" "[::1]")))
-      (should (string-equal (file-remote-p "/-:[]:" 'method) "default-method"))
-      (should (string-equal (file-remote-p "/-:[]:" 'user) "default-user"))
-      (should (string-equal (file-remote-p "/-:[]:" 'host) "::1"))
-      (should (string-equal (file-remote-p "/-:[]:" 'localname) ""))
-      (should (string-equal (file-remote-p "/-:[]:" 'hop) nil)))
-
-    ;; Expand `tramp-default-method' and `tramp-default-user'.
-    (should (string-equal
-            (file-remote-p "/-:[::1]:")
-            (format "/%s:%s@%s:" "default-method" "default-user" "[::1]")))
-    (should (string-equal (file-remote-p "/-:[::1]:" 'method) 
"default-method"))
-    (should (string-equal (file-remote-p "/-:[::1]:" 'user) "default-user"))
-    (should (string-equal (file-remote-p "/-:[::1]:" 'host) "::1"))
-    (should (string-equal (file-remote-p "/-:[::1]:" 'localname) ""))
-    (should (string-equal (file-remote-p "/-:[::1]:" 'hop) nil))
-
-    ;; Expand `tramp-default-method'.
-    (should (string-equal
-            (file-remote-p "/-:user@[::1]:")
-            (format "/%s:%s@%s:" "default-method" "user" "[::1]")))
-    (should (string-equal
-            (file-remote-p "/-:user@[::1]:" 'method) "default-method"))
-    (should (string-equal (file-remote-p "/-:user@[::1]:" 'user) "user"))
-    (should (string-equal (file-remote-p "/-:user@[::1]:" 'host) "::1"))
-    (should (string-equal (file-remote-p "/-:user@[::1]:" 'localname) ""))
-    (should (string-equal (file-remote-p "/-:user@[::1]:" 'hop) nil))
-
-    ;; Expand `tramp-default-user'.
-    (should (string-equal
-            (file-remote-p "/method:[::1]:")
-            (format "/%s:%s@%s:" "method" "default-user" "[::1]")))
-    (should (string-equal (file-remote-p "/method:[::1]:" 'method) "method"))
-    (should (string-equal
-            (file-remote-p "/method:[::1]:" 'user) "default-user"))
-    (should (string-equal (file-remote-p "/method:[::1]:" 'host) "::1"))
-    (should (string-equal (file-remote-p "/method:[::1]:" 'localname) ""))
-    (should (string-equal (file-remote-p "/method:[::1]:" 'hop) nil))
-
-    ;; No expansion.
-    (should (string-equal
-            (file-remote-p "/method:user@[::1]:")
-            (format "/%s:%s@%s:" "method" "user" "[::1]")))
-    (should (string-equal
-            (file-remote-p "/method:user@[::1]:" 'method) "method"))
-    (should (string-equal (file-remote-p "/method:user@[::1]:" 'user) "user"))
-    (should (string-equal (file-remote-p "/method:user@[::1]:" 'host) "::1"))
-    (should (string-equal
-            (file-remote-p "/method:user@[::1]:" 'localname) ""))
-    (should (string-equal (file-remote-p "/method:user@[::1]:" 'hop) nil))
-
-    ;; Local file name part.
-    (should (string-equal (file-remote-p "/-:host:/:" 'localname) "/:"))
-    (should (string-equal (file-remote-p "/method:::" 'localname) ":"))
-    (should (string-equal (file-remote-p "/method:: " 'localname) " "))
-    (should (string-equal (file-remote-p "/method::file" 'localname) "file"))
-    (should (string-equal
-            (file-remote-p "/method::/path/to/file" 'localname)
-            "/path/to/file"))
-
-    ;; Multihop.
-    (should
-     (string-equal
-      (file-remote-p "/method1:user1@host1|method2:user2@host2:/path/to/file")
-      (format "/%s:%s@%s|%s:%s@%s:"
-             "method1" "user1" "host1" "method2" "user2" "host2")))
-    (should
-     (string-equal
-      (file-remote-p
-       "/method1:user1@host1|method2:user2@host2:/path/to/file" 'method)
-      "method2"))
-    (should
-     (string-equal
-      (file-remote-p
-       "/method1:user1@host1|method2:user2@host2:/path/to/file" 'user)
-      "user2"))
-    (should
-     (string-equal
-      (file-remote-p
-       "/method1:user1@host1|method2:user2@host2:/path/to/file" 'host)
-      "host2"))
-    (should
-     (string-equal
-      (file-remote-p
-       "/method1:user1@host1|method2:user2@host2:/path/to/file" 'localname)
-      "/path/to/file"))
-    (should
-     (string-equal
-      (file-remote-p
-       "/method1:user1@host1|method2:user2@host2:/path/to/file" 'hop)
-      (format "%s:%s@%s|"
-             "method1" "user1" "host1")))
+       (tramp-connection-properties '((nil "login-program" t)))
+       (syntax tramp-syntax))
+    (unwind-protect
+       (progn
+         (tramp-change-syntax 'default)
+         ;; An unknown method shall raise an error.
+         (let (non-essential)
+           (should-error
+            (expand-file-name "/method:user@host:")
+            :type 'user-error))
 
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/method1:user1@host1"
-       "|method2:user2@host2"
-       "|method3:user3@host3:/path/to/file"))
-      (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
-             "method1" "user1" "host1"
-             "method2" "user2" "host2"
-             "method3" "user3" "host3")))
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/method1:user1@host1"
-       "|method2:user2@host2"
-       "|method3:user3@host3:/path/to/file")
-       'method)
-      "method3"))
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/method1:user1@host1"
-       "|method2:user2@host2"
-       "|method3:user3@host3:/path/to/file")
-       'user)
-      "user3"))
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/method1:user1@host1"
-       "|method2:user2@host2"
-       "|method3:user3@host3:/path/to/file")
-       'host)
-      "host3"))
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/method1:user1@host1"
-       "|method2:user2@host2"
-       "|method3:user3@host3:/path/to/file")
-       'localname)
-      "/path/to/file"))
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/method1:user1@host1"
-       "|method2:user2@host2"
-       "|method3:user3@host3:/path/to/file")
-       'hop)
-      (format "%s:%s@%s|%s:%s@%s|"
-             "method1" "user1" "host1" "method2" "user2" "host2")))
-
-    ;; Expand `tramp-default-method-alist'.
-    (add-to-list 'tramp-default-method-alist '("host1" "user1" "method1"))
-    (add-to-list 'tramp-default-method-alist '("host2" "user2" "method2"))
-    (add-to-list 'tramp-default-method-alist '("host3" "user3" "method3"))
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/-:user1@host1"
-       "|-:user2@host2"
-       "|-:user3@host3:/path/to/file"))
-      (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
-             "method1" "user1" "host1"
-             "method2" "user2" "host2"
-             "method3" "user3" "host3")))
-
-    ;; Expand `tramp-default-user-alist'.
-    (add-to-list 'tramp-default-user-alist '("method1" "host1" "user1"))
-    (add-to-list 'tramp-default-user-alist '("method2" "host2" "user2"))
-    (add-to-list 'tramp-default-user-alist '("method3" "host3" "user3"))
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/method1:host1"
-       "|method2:host2"
-       "|method3:host3:/path/to/file"))
-      (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
-             "method1" "user1" "host1"
-             "method2" "user2" "host2"
-             "method3" "user3" "host3")))
-
-    ;; Expand `tramp-default-host-alist'.
-    (add-to-list 'tramp-default-host-alist '("method1" "user1" "host1"))
-    (add-to-list 'tramp-default-host-alist '("method2" "user2" "host2"))
-    (add-to-list 'tramp-default-host-alist '("method3" "user3" "host3"))
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/method1:user1@"
-       "|method2:user2@"
-       "|method3:user3@:/path/to/file"))
-      (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
-             "method1" "user1" "host1"
-             "method2" "user2" "host2"
-             "method3" "user3" "host3")))
-
-    ;; Ad-hoc user name and host name expansion.
-    (setq tramp-default-method-alist nil
-         tramp-default-user-alist nil
-         tramp-default-host-alist nil)
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/method1:user1@host1"
-       "|method2:user2@"
-       "|method3:user3@:/path/to/file"))
-      (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
-             "method1" "user1" "host1"
-             "method2" "user2" "host1"
-             "method3" "user3" "host1")))
-    (should
-     (string-equal
-      (file-remote-p
-       (concat
-       "/method1:%u@%h"
-       "|method2:user2@host2"
-       "|method3:%u@%h"
-       "|method4:user4%domain4@host4#1234:/path/to/file"))
-      (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s|%s:%s@%s:"
-             "method1" "user2" "host2"
-             "method2" "user2" "host2"
-             "method3" "user4" "host4"
-             "method4" "user4%domain4" "host4#1234")))))
+         ;; Expand `tramp-default-user' and `tramp-default-host'.
+         (should
+          (string-equal
+           (file-remote-p "/method::")
+           (format "/%s:%s@%s:" "method" "default-user" "default-host")))
+         (should (string-equal (file-remote-p "/method::" 'method) "method"))
+         (should
+          (string-equal (file-remote-p "/method::" 'user) "default-user"))
+         (should
+          (string-equal (file-remote-p "/method::" 'host) "default-host"))
+         (should (string-equal (file-remote-p "/method::" 'localname) ""))
+         (should (string-equal (file-remote-p "/method::" 'hop) nil))
+
+         ;; Expand `tramp-default-method' and `tramp-default-user'.
+         (should
+          (string-equal
+           (file-remote-p "/-:host:")
+           (format "/%s:%s@%s:" "default-method" "default-user" "host")))
+         (should
+          (string-equal (file-remote-p "/-:host:" 'method) "default-method"))
+         (should
+          (string-equal (file-remote-p "/-:host:" 'user) "default-user"))
+         (should (string-equal (file-remote-p "/-:host:" 'host) "host"))
+         (should (string-equal (file-remote-p "/-:host:" 'localname) ""))
+         (should (string-equal (file-remote-p "/-:host:" 'hop) nil))
+
+         ;; Expand `tramp-default-method' and `tramp-default-host'.
+         (should
+          (string-equal
+           (file-remote-p "/-:user@:")
+           (format "/%s:%s@%s:" "default-method" "user" "default-host")))
+         (should
+          (string-equal (file-remote-p "/-:user@:" 'method) "default-method"))
+         (should (string-equal (file-remote-p "/-:user@:" 'user) "user"))
+         (should
+          (string-equal (file-remote-p "/-:user@:" 'host) "default-host"))
+         (should (string-equal (file-remote-p "/-:user@:" 'localname) ""))
+         (should (string-equal (file-remote-p "/-:user@:" 'hop) nil))
+
+         ;; Expand `tramp-default-method'.
+         (should (string-equal
+                  (file-remote-p "/-:user@host:")
+                  (format "/%s:%s@%s:" "default-method" "user" "host")))
+         (should (string-equal
+                  (file-remote-p "/-:user@host:" 'method) "default-method"))
+         (should (string-equal (file-remote-p "/-:user@host:" 'user) "user"))
+         (should (string-equal (file-remote-p "/-:user@host:" 'host) "host"))
+         (should (string-equal (file-remote-p "/-:user@host:" 'localname) ""))
+         (should (string-equal (file-remote-p "/-:user@host:" 'hop) nil))
+
+         ;; Expand `tramp-default-user'.
+         (should (string-equal
+                  (file-remote-p "/method:host:")
+                  (format "/%s:%s@%s:" "method" "default-user" "host")))
+         (should
+          (string-equal (file-remote-p "/method:host:" 'method) "method"))
+         (should
+          (string-equal (file-remote-p "/method:host:" 'user) "default-user"))
+         (should (string-equal (file-remote-p "/method:host:" 'host) "host"))
+         (should (string-equal (file-remote-p "/method:host:" 'localname) ""))
+         (should (string-equal (file-remote-p "/method:host:" 'hop) nil))
+
+         ;; Expand `tramp-default-host'.
+         (should
+          (string-equal
+           (file-remote-p "/method:user@:")
+           (format "/%s:%s@%s:" "method" "user" "default-host")))
+         (should
+          (string-equal (file-remote-p "/method:user@:" 'method) "method"))
+         (should (string-equal (file-remote-p "/method:user@:" 'user) "user"))
+         (should
+          (string-equal (file-remote-p "/method:user@:" 'host) "default-host"))
+         (should (string-equal (file-remote-p "/method:user@:" 'localname) ""))
+         (should (string-equal (file-remote-p "/method:user@:" 'hop) nil))
+
+         ;; No expansion.
+         (should (string-equal
+                  (file-remote-p "/method:user@host:")
+                  (format "/%s:%s@%s:" "method" "user" "host")))
+         (should (string-equal
+                  (file-remote-p "/method:user@host:" 'method) "method"))
+         (should
+          (string-equal (file-remote-p "/method:user@host:" 'user) "user"))
+         (should
+          (string-equal (file-remote-p "/method:user@host:" 'host) "host"))
+         (should
+          (string-equal (file-remote-p "/method:user@host:" 'localname) ""))
+         (should (string-equal (file-remote-p "/method:user@host:" 'hop) nil))
+
+         ;; No expansion.
+         (should (string-equal
+                  (file-remote-p "/method:user@email@host:")
+                  (format "/%s:%s@%s:" "method" "user@email" "host")))
+         (should (string-equal
+                  (file-remote-p "/method:user@email@host:" 'method) "method"))
+         (should
+          (string-equal
+           (file-remote-p "/method:user@email@host:" 'user) "user@email"))
+         (should (string-equal
+                  (file-remote-p "/method:user@email@host:" 'host) "host"))
+         (should (string-equal
+                  (file-remote-p "/method:user@email@host:" 'localname) ""))
+         (should (string-equal
+                  (file-remote-p "/method:user@email@host:" 'hop) nil))
+
+         ;; Expand `tramp-default-method' and `tramp-default-user'.
+         (should
+          (string-equal
+           (file-remote-p "/-:host#1234:")
+           (format "/%s:%s@%s:" "default-method" "default-user" "host#1234")))
+         (should (string-equal
+                  (file-remote-p "/-:host#1234:" 'method) "default-method"))
+         (should
+          (string-equal (file-remote-p "/-:host#1234:" 'user) "default-user"))
+         (should
+          (string-equal (file-remote-p "/-:host#1234:" 'host) "host#1234"))
+         (should (string-equal (file-remote-p "/-:host#1234:" 'localname) ""))
+         (should (string-equal (file-remote-p "/-:host#1234:" 'hop) nil))
+
+         ;; Expand `tramp-default-method'.
+         (should (string-equal
+                  (file-remote-p "/-:user@host#1234:")
+                  (format "/%s:%s@%s:" "default-method" "user" "host#1234")))
+         (should
+          (string-equal
+           (file-remote-p "/-:user@host#1234:" 'method) "default-method"))
+         (should
+          (string-equal (file-remote-p "/-:user@host#1234:" 'user) "user"))
+         (should
+          (string-equal
+           (file-remote-p "/-:user@host#1234:" 'host) "host#1234"))
+         (should
+          (string-equal (file-remote-p "/-:user@host#1234:" 'localname) ""))
+         (should (string-equal (file-remote-p "/-:user@host#1234:" 'hop) nil))
+
+         ;; Expand `tramp-default-user'.
+         (should (string-equal
+                  (file-remote-p "/method:host#1234:")
+                  (format "/%s:%s@%s:" "method" "default-user" "host#1234")))
+         (should (string-equal
+                  (file-remote-p "/method:host#1234:" 'method) "method"))
+         (should (string-equal
+                  (file-remote-p "/method:host#1234:" 'user) "default-user"))
+         (should (string-equal
+                  (file-remote-p "/method:host#1234:" 'host) "host#1234"))
+         (should
+          (string-equal (file-remote-p "/method:host#1234:" 'localname) ""))
+         (should (string-equal (file-remote-p "/method:host#1234:" 'hop) nil))
+
+         ;; No expansion.
+         (should (string-equal
+                  (file-remote-p "/method:user@host#1234:")
+                  (format "/%s:%s@%s:" "method" "user" "host#1234")))
+         (should (string-equal
+                  (file-remote-p "/method:user@host#1234:" 'method) "method"))
+         (should (string-equal
+                  (file-remote-p "/method:user@host#1234:" 'user) "user"))
+         (should (string-equal
+                  (file-remote-p "/method:user@host#1234:" 'host) "host#1234"))
+         (should (string-equal
+                  (file-remote-p "/method:user@host#1234:" 'localname) ""))
+         (should (string-equal
+                  (file-remote-p "/method:user@host#1234:" 'hop) nil))
+
+         ;; Expand `tramp-default-method' and `tramp-default-user'.
+         (should
+          (string-equal
+           (file-remote-p "/-:1.2.3.4:")
+           (format "/%s:%s@%s:" "default-method" "default-user" "1.2.3.4")))
+         (should
+          (string-equal
+           (file-remote-p "/-:1.2.3.4:" 'method) "default-method"))
+         (should
+          (string-equal (file-remote-p "/-:1.2.3.4:" 'user) "default-user"))
+         (should (string-equal (file-remote-p "/-:1.2.3.4:" 'host) "1.2.3.4"))
+         (should (string-equal (file-remote-p "/-:1.2.3.4:" 'localname) ""))
+         (should (string-equal (file-remote-p "/-:1.2.3.4:" 'hop) nil))
+
+         ;; Expand `tramp-default-method'.
+         (should (string-equal
+                  (file-remote-p "/-:user@1.2.3.4:")
+                  (format "/%s:%s@%s:" "default-method" "user" "1.2.3.4")))
+         (should (string-equal
+                  (file-remote-p "/-:user@1.2.3.4:" 'method) "default-method"))
+         (should
+          (string-equal (file-remote-p "/-:user@1.2.3.4:" 'user) "user"))
+         (should
+          (string-equal (file-remote-p "/-:user@1.2.3.4:" 'host) "1.2.3.4"))
+         (should
+          (string-equal (file-remote-p "/-:user@1.2.3.4:" 'localname) ""))
+         (should
+          (string-equal (file-remote-p "/-:user@1.2.3.4:" 'hop) nil))
+
+         ;; Expand `tramp-default-user'.
+         (should (string-equal
+                  (file-remote-p "/method:1.2.3.4:")
+                  (format "/%s:%s@%s:" "method" "default-user" "1.2.3.4")))
+         (should
+          (string-equal (file-remote-p "/method:1.2.3.4:" 'method) "method"))
+         (should (string-equal
+                  (file-remote-p "/method:1.2.3.4:" 'user) "default-user"))
+         (should
+          (string-equal (file-remote-p "/method:1.2.3.4:" 'host) "1.2.3.4"))
+         (should
+          (string-equal (file-remote-p "/method:1.2.3.4:" 'localname) ""))
+         (should (string-equal (file-remote-p "/method:1.2.3.4:" 'hop) nil))
+
+         ;; No expansion.
+         (should (string-equal
+                  (file-remote-p "/method:user@1.2.3.4:")
+                  (format "/%s:%s@%s:" "method" "user" "1.2.3.4")))
+         (should (string-equal
+                  (file-remote-p "/method:user@1.2.3.4:" 'method) "method"))
+         (should
+          (string-equal (file-remote-p "/method:user@1.2.3.4:" 'user) "user"))
+         (should (string-equal
+                  (file-remote-p "/method:user@1.2.3.4:" 'host) "1.2.3.4"))
+         (should (string-equal
+                  (file-remote-p "/method:user@1.2.3.4:" 'localname) ""))
+         (should (string-equal
+                  (file-remote-p "/method:user@1.2.3.4:" 'hop) nil))
+
+         ;; Expand `tramp-default-method', `tramp-default-user' and
+         ;; `tramp-default-host'.
+         (should
+          (string-equal
+           (file-remote-p "/-:[]:")
+           (format
+            "/%s:%s@%s:" "default-method" "default-user" "default-host")))
+         (should
+          (string-equal (file-remote-p "/-:[]:" 'method) "default-method"))
+         (should (string-equal (file-remote-p "/-:[]:" 'user) "default-user"))
+         (should (string-equal (file-remote-p "/-:[]:" 'host) "default-host"))
+         (should (string-equal (file-remote-p "/-:[]:" 'localname) ""))
+         (should (string-equal (file-remote-p "/-:[]:" 'hop) nil))
+
+         ;; Expand `tramp-default-method' and `tramp-default-user'.
+         (let ((tramp-default-host "::1"))
+           (should
+            (string-equal
+             (file-remote-p "/-:[]:")
+             (format "/%s:%s@%s:" "default-method" "default-user" "[::1]")))
+           (should
+            (string-equal (file-remote-p "/-:[]:" 'method) "default-method"))
+           (should
+            (string-equal (file-remote-p "/-:[]:" 'user) "default-user"))
+           (should (string-equal (file-remote-p "/-:[]:" 'host) "::1"))
+           (should (string-equal (file-remote-p "/-:[]:" 'localname) ""))
+           (should (string-equal (file-remote-p "/-:[]:" 'hop) nil)))
+
+         ;; Expand `tramp-default-method' and `tramp-default-user'.
+         (should
+          (string-equal
+           (file-remote-p "/-:[::1]:")
+           (format "/%s:%s@%s:" "default-method" "default-user" "[::1]")))
+         (should
+          (string-equal (file-remote-p "/-:[::1]:" 'method) "default-method"))
+         (should
+          (string-equal (file-remote-p "/-:[::1]:" 'user) "default-user"))
+         (should (string-equal (file-remote-p "/-:[::1]:" 'host) "::1"))
+         (should (string-equal (file-remote-p "/-:[::1]:" 'localname) ""))
+         (should (string-equal (file-remote-p "/-:[::1]:" 'hop) nil))
+
+         ;; Expand `tramp-default-method'.
+         (should (string-equal
+                  (file-remote-p "/-:user@[::1]:")
+                  (format "/%s:%s@%s:" "default-method" "user" "[::1]")))
+         (should (string-equal
+                  (file-remote-p "/-:user@[::1]:" 'method) "default-method"))
+         (should (string-equal (file-remote-p "/-:user@[::1]:" 'user) "user"))
+         (should (string-equal (file-remote-p "/-:user@[::1]:" 'host) "::1"))
+         (should (string-equal (file-remote-p "/-:user@[::1]:" 'localname) ""))
+         (should (string-equal (file-remote-p "/-:user@[::1]:" 'hop) nil))
+
+         ;; Expand `tramp-default-user'.
+         (should (string-equal
+                  (file-remote-p "/method:[::1]:")
+                  (format "/%s:%s@%s:" "method" "default-user" "[::1]")))
+         (should
+          (string-equal (file-remote-p "/method:[::1]:" 'method) "method"))
+         (should (string-equal
+                  (file-remote-p "/method:[::1]:" 'user) "default-user"))
+         (should (string-equal (file-remote-p "/method:[::1]:" 'host) "::1"))
+         (should (string-equal (file-remote-p "/method:[::1]:" 'localname) ""))
+         (should (string-equal (file-remote-p "/method:[::1]:" 'hop) nil))
+
+         ;; No expansion.
+         (should (string-equal
+                  (file-remote-p "/method:user@[::1]:")
+                  (format "/%s:%s@%s:" "method" "user" "[::1]")))
+         (should (string-equal
+                  (file-remote-p "/method:user@[::1]:" 'method) "method"))
+         (should
+          (string-equal (file-remote-p "/method:user@[::1]:" 'user) "user"))
+         (should
+          (string-equal (file-remote-p "/method:user@[::1]:" 'host) "::1"))
+         (should (string-equal
+                  (file-remote-p "/method:user@[::1]:" 'localname) ""))
+         (should (string-equal (file-remote-p "/method:user@[::1]:" 'hop) nil))
+
+         ;; Local file name part.
+         (should (string-equal (file-remote-p "/-:host:/:" 'localname) "/:"))
+         (should (string-equal (file-remote-p "/method:::" 'localname) ":"))
+         (should (string-equal (file-remote-p "/method:: " 'localname) " "))
+         (should
+          (string-equal (file-remote-p "/method::file" 'localname) "file"))
+         (should (string-equal
+                  (file-remote-p "/method::/path/to/file" 'localname)
+                  "/path/to/file"))
+
+         ;; Multihop.
+         (should
+          (string-equal
+           (file-remote-p
+            "/method1:user1@host1|method2:user2@host2:/path/to/file")
+           (format "/%s:%s@%s|%s:%s@%s:"
+                   "method1" "user1" "host1" "method2" "user2" "host2")))
+         (should
+          (string-equal
+           (file-remote-p
+            "/method1:user1@host1|method2:user2@host2:/path/to/file" 'method)
+           "method2"))
+         (should
+          (string-equal
+           (file-remote-p
+            "/method1:user1@host1|method2:user2@host2:/path/to/file" 'user)
+           "user2"))
+         (should
+          (string-equal
+           (file-remote-p
+            "/method1:user1@host1|method2:user2@host2:/path/to/file" 'host)
+           "host2"))
+         (should
+          (string-equal
+           (file-remote-p
+            "/method1:user1@host1|method2:user2@host2:/path/to/file"
+            'localname)
+           "/path/to/file"))
+         (should
+          (string-equal
+           (file-remote-p
+            "/method1:user1@host1|method2:user2@host2:/path/to/file" 'hop)
+           (format "%s:%s@%s|"
+                   "method1" "user1" "host1")))
+
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/method1:user1@host1"
+             "|method2:user2@host2"
+             "|method3:user3@host3:/path/to/file"))
+           (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+                   "method1" "user1" "host1"
+                   "method2" "user2" "host2"
+                   "method3" "user3" "host3")))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/method1:user1@host1"
+             "|method2:user2@host2"
+             "|method3:user3@host3:/path/to/file")
+            'method)
+           "method3"))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/method1:user1@host1"
+             "|method2:user2@host2"
+             "|method3:user3@host3:/path/to/file")
+            'user)
+           "user3"))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/method1:user1@host1"
+             "|method2:user2@host2"
+             "|method3:user3@host3:/path/to/file")
+            'host)
+           "host3"))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/method1:user1@host1"
+             "|method2:user2@host2"
+             "|method3:user3@host3:/path/to/file")
+            'localname)
+           "/path/to/file"))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/method1:user1@host1"
+             "|method2:user2@host2"
+             "|method3:user3@host3:/path/to/file")
+            'hop)
+           (format "%s:%s@%s|%s:%s@%s|"
+                   "method1" "user1" "host1" "method2" "user2" "host2")))
+
+         ;; Expand `tramp-default-method-alist'.
+         (add-to-list 'tramp-default-method-alist '("host1" "user1" "method1"))
+         (add-to-list 'tramp-default-method-alist '("host2" "user2" "method2"))
+         (add-to-list 'tramp-default-method-alist '("host3" "user3" "method3"))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/-:user1@host1"
+             "|-:user2@host2"
+             "|-:user3@host3:/path/to/file"))
+           (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+                   "method1" "user1" "host1"
+                   "method2" "user2" "host2"
+                   "method3" "user3" "host3")))
+
+         ;; Expand `tramp-default-user-alist'.
+         (add-to-list 'tramp-default-user-alist '("method1" "host1" "user1"))
+         (add-to-list 'tramp-default-user-alist '("method2" "host2" "user2"))
+         (add-to-list 'tramp-default-user-alist '("method3" "host3" "user3"))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/method1:host1"
+             "|method2:host2"
+             "|method3:host3:/path/to/file"))
+           (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+                   "method1" "user1" "host1"
+                   "method2" "user2" "host2"
+                   "method3" "user3" "host3")))
+
+         ;; Expand `tramp-default-host-alist'.
+         (add-to-list 'tramp-default-host-alist '("method1" "user1" "host1"))
+         (add-to-list 'tramp-default-host-alist '("method2" "user2" "host2"))
+         (add-to-list 'tramp-default-host-alist '("method3" "user3" "host3"))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/method1:user1@"
+             "|method2:user2@"
+             "|method3:user3@:/path/to/file"))
+           (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+                   "method1" "user1" "host1"
+                   "method2" "user2" "host2"
+                   "method3" "user3" "host3")))
+
+         ;; Ad-hoc user name and host name expansion.
+         (setq tramp-default-method-alist nil
+               tramp-default-user-alist nil
+               tramp-default-host-alist nil)
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/method1:user1@host1"
+             "|method2:user2@"
+             "|method3:user3@:/path/to/file"))
+           (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+                   "method1" "user1" "host1"
+                   "method2" "user2" "host1"
+                   "method3" "user3" "host1")))
+         (should
+          (string-equal
+           (file-remote-p
+            (concat
+             "/method1:%u@%h"
+             "|method2:user2@host2"
+             "|method3:%u@%h"
+             "|method4:user4%domain4@host4#1234:/path/to/file"))
+           (format "/%s:%s@%s|%s:%s@%s|%s:%s@%s|%s:%s@%s:"
+                   "method1" "user2" "host2"
+                   "method2" "user2" "host2"
+                   "method3" "user4" "host4"
+                   "method4" "user4%domain4" "host4#1234"))))
+
+      ;; Exit.
+      (tramp-change-syntax syntax))))
 
 (ert-deftest tramp-test02-file-name-dissect-simplified ()
   "Check simplified file name components."
@@ -1853,6 +1928,8 @@ properly.  BODY shall not contain a timeout."
 
 (ert-deftest tramp-test03-file-name-defaults ()
   "Check default values for some methods."
+  (skip-unless (eq tramp-syntax 'default))
+
   ;; Default values in tramp-adb.el.
   (when (assoc "adb" tramp-methods)
     (should (string-equal (file-remote-p "/adb::" 'host) "")))
@@ -1882,6 +1959,7 @@ properly.  BODY shall not contain a timeout."
 ;; The following test is inspired by Bug#30946.
 (ert-deftest tramp-test03-file-name-host-rules ()
   "Check host name rules for host-less methods."
+  (skip-unless (eq tramp-syntax 'default))
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
 
@@ -1906,6 +1984,7 @@ properly.  BODY shall not contain a timeout."
 
 (ert-deftest tramp-test03-file-name-method-rules ()
   "Check file name rules for some methods."
+  (skip-unless (eq tramp-syntax 'default))
   (skip-unless (tramp--test-enabled))
 
   ;; Multi hops are allowed for inline methods only.
@@ -1928,6 +2007,8 @@ properly.  BODY shall not contain a timeout."
 
 (ert-deftest tramp-test04-substitute-in-file-name ()
   "Check `substitute-in-file-name'."
+  (skip-unless (eq tramp-syntax 'default))
+
   ;; Suppress method name check.
   (let ((tramp-methods (cons '("method") tramp-methods)))
     (should
@@ -2023,6 +2104,8 @@ properly.  BODY shall not contain a timeout."
 
 (ert-deftest tramp-test05-expand-file-name ()
   "Check `expand-file-name'."
+  (skip-unless (eq tramp-syntax 'default))
+
   ;; Suppress method name check.
   (let ((tramp-methods (cons '("method") tramp-methods)))
     (should
@@ -2085,6 +2168,8 @@ properly.  BODY shall not contain a timeout."
   "Check `directory-file-name'.
 This checks also `file-name-as-directory', `file-name-directory',
 `file-name-nondirectory' and `unhandled-file-name-directory'."
+  (skip-unless (eq tramp-syntax 'default))
+
   ;; Suppress method name check.
   (let ((tramp-methods (cons '("method") tramp-methods)))
     (should
@@ -2138,15 +2223,17 @@ This checks also `file-name-as-directory', 
`file-name-directory',
       ;; which ruins the tests.
       (let ((non-essential n-e)
            (tramp-default-method
-            (file-remote-p tramp-test-temporary-file-directory 'method)))
+            (file-remote-p tramp-test-temporary-file-directory 'method))
+           (host (file-remote-p tramp-test-temporary-file-directory 'host)))
        (dolist
            (file
-            `(,(format
-                "/%s::"
-                (file-remote-p tramp-test-temporary-file-directory 'method))
+            `(,(format "/%s::" tramp-default-method)
               ,(format
-                 "/-:%s:"
-                 (file-remote-p tramp-test-temporary-file-directory 'host))))
+                "/-:%s:"
+                (if (string-match-p tramp-ipv6-regexp host)
+                    (concat
+                     tramp-prefix-ipv6-format host tramp-postfix-ipv6-format)
+                  host))))
          (should (string-equal (directory-file-name file) file))
          (should
           (string-equal
@@ -2233,7 +2320,8 @@ This checks also `file-name-as-directory', 
`file-name-directory',
   (skip-unless (tramp--test-enabled))
 
   (dolist (quoted (if (tramp--test-expensive-test) '(nil t) '(nil)))
-    (let ((tmp-name (tramp--test-make-temp-name nil quoted)))
+    (let ((tmp-name (tramp--test-make-temp-name nil quoted))
+          (inhibit-message t))
       (unwind-protect
          (progn
             ;; Write buffer.  Use absolute and relative file name.
@@ -2300,7 +2388,8 @@ This checks also `file-name-as-directory', 
`file-name-directory',
                       (string-match
                        (if (and (null noninteractive)
                                 (or (eq visit t) (null visit) (stringp visit)))
-                           (format "^Wrote %s\n\\'" tmp-name) "^\\'")
+                           (format "^Wrote %s\n\\'" (regexp-quote tmp-name))
+                         "^\\'")
                        tramp--test-messages))))))))
 
            ;; Do not overwrite if excluded.
@@ -2332,6 +2421,7 @@ This checks also `file-name-as-directory', 
`file-name-directory',
   (skip-unless (tramp--test-emacs27-p))
 
   (let* ((tmp-name (tramp--test-make-temp-name))
+         (inhibit-message t)
          written-files
          (advice (lambda (_start _end filename &rest _r)
                    (push filename written-files))))
@@ -2812,8 +2902,7 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
              (sort (copy-sequence `(,tmp-name3 ,tmp-name4)) 'string<))))
 
        ;; Cleanup.
-       (ignore-errors
-         (delete-directory tmp-name1 'recursive))))))
+       (ignore-errors (delete-directory tmp-name1 'recursive))))))
 
 (ert-deftest tramp-test17-insert-directory ()
   "Check `insert-directory'."
@@ -2887,6 +2976,8 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
 
 (ert-deftest tramp-test17-dired-with-wildcards ()
   "Check `dired' with wildcards."
+  ;; `separate' syntax and IPv6 host name syntax do not work.
+  (skip-unless (not (string-match-p "\\[" 
tramp-test-temporary-file-directory)))
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
   (skip-unless (not (tramp--test-rsync-p)))
@@ -3166,7 +3257,7 @@ They might differ only in time attributes or directory 
size."
     (when (< start-time
             (float-time (tramp-compat-file-attribute-modification-time attr2)))
       (setcar (nthcdr 5 attr2) tramp-time-dont-know))
-    ;; Status change time.  Dito.
+    ;; Status change time.  Ditto.
     (when (or (tramp-compat-time-equal-p
               (tramp-compat-file-attribute-status-change-time attr1)
               tramp-time-dont-know)
@@ -3459,18 +3550,20 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
            (should (file-equal-p tmp-name1 tmp-name2))
            ;; Symbolic links could look like a remote file name.
            ;; They must be quoted then.
-           (delete-file tmp-name2)
-           (make-symbolic-link
-            (funcall
-             (if quoted #'tramp-compat-file-name-unquote #'identity)
-             "/penguin:motd:")
-            tmp-name2)
-           (should (file-symlink-p tmp-name2))
-           (should
-            (string-equal
-             (file-truename tmp-name2)
-             (tramp-compat-file-name-quote
-              (concat (file-remote-p tmp-name2) "/penguin:motd:"))))
+           (let ((penguin
+                  (if (eq tramp-syntax 'separate)
+                      "/[penguin/motd]" "/penguin:motd:")))
+             (delete-file tmp-name2)
+             (make-symbolic-link
+              (funcall
+               (if quoted #'tramp-compat-file-name-unquote #'identity) penguin)
+              tmp-name2)
+             (should (file-symlink-p tmp-name2))
+             (should
+              (string-equal
+               (file-truename tmp-name2)
+               (tramp-compat-file-name-quote
+                (concat (file-remote-p tmp-name2) penguin)))))
            ;; `tmp-name3' is a local file name.
            ;; `make-symbolic-link' might not be permitted on w32 systems.
            (unless (tramp--test-windows-nt)
@@ -3878,7 +3971,14 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
                   (if (zerop (length tramp-method-regexp))
                       "" tramp-default-method-marker))
                  ;; This is needed for the `separate' syntax.
-                 (prefix-format (substring tramp-prefix-format 1)))
+                 (prefix-format (substring tramp-prefix-format 1))
+                ;; This is needed for the IPv6 host name syntax.
+                (ipv6-prefix
+                 (and (string-match-p tramp-ipv6-regexp host)
+                      tramp-prefix-ipv6-format))
+                (ipv6-postfix
+                 (and (string-match-p tramp-ipv6-regexp host)
+                      tramp-postfix-ipv6-format)))
               ;; Complete method name.
              (unless (or (zerop (length method))
                           (zerop (length tramp-method-regexp)))
@@ -3897,11 +3997,11 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
                   (member
                    (concat
                      prefix-format method-marker tramp-postfix-method-format
-                     host tramp-postfix-host-format)
+                    ipv6-prefix host ipv6-postfix tramp-postfix-host-format)
                    (file-name-all-completions
                     (concat
                       prefix-format method-marker tramp-postfix-method-format
-                      (substring host 0 1))
+                     ipv6-prefix (substring host 0 1))
                      "/")))))
               ;; Complete host name.
              (unless (or (zerop (length method))
@@ -3912,7 +4012,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
                 (member
                  (concat
                    prefix-format method tramp-postfix-method-format
-                   host tramp-postfix-host-format)
+                  ipv6-prefix host ipv6-postfix tramp-postfix-host-format)
                  (file-name-all-completions
                   (concat prefix-format method tramp-postfix-method-format)
                    "/"))))))
@@ -4150,7 +4250,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
     (let ((default-directory tramp-test-temporary-file-directory)
          (tmp-name (tramp--test-make-temp-name nil quoted))
          kill-buffer-query-functions proc)
-      (should-not (with-no-warnings (make-process)))
+      (with-no-warnings (should-not (make-process)))
 
       ;; Simple process.
       (unwind-protect
@@ -4253,8 +4353,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
 
       ;; Process with stderr.  tramp-adb.el doesn't support it (yet).
       (unless (tramp--test-adb-p)
-       (let ((stderr
-              (generate-new-buffer (generate-new-buffer-name "stderr"))))
+       (let ((stderr (generate-new-buffer "*stderr*")))
          (unwind-protect
              (with-temp-buffer
                (setq proc
@@ -4357,6 +4456,20 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
        ;; Cleanup.
        (ignore-errors (delete-file tmp-name)))
 
+      ;; Test `shell-command' with error buffer.
+      (let ((stderr (generate-new-buffer "*stderr*")))
+       (unwind-protect
+           (with-temp-buffer
+             (shell-command "error" (current-buffer) stderr)
+             (should (= (point-min) (point-max)))
+             (should
+              (string-match
+               "error:.+not found"
+               (with-current-buffer stderr (buffer-string)))))
+
+         ;; Cleanup.
+         (ignore-errors (kill-buffer stderr))))
+
       ;; Test ordinary `async-shell-command'.
       (unwind-protect
          (with-temp-buffer
@@ -4374,10 +4487,6 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
            (while
                (re-search-forward tramp-display-escape-sequence-regexp nil t)
              (replace-match "" nil nil))
-           ;; There might be a nasty "Process *Async Shell* finished" message.
-           (goto-char (point-min))
-           (forward-line)
-           (narrow-to-region (point-min) (point))
            (should
             (string-equal
              (format "%s\n" (file-name-nondirectory tmp-name))
@@ -4404,13 +4513,11 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
            (while
                (re-search-forward tramp-display-escape-sequence-regexp nil t)
              (replace-match "" nil nil))
-           ;; There might be a nasty "Process *Async Shell* finished" message.
-           (goto-char (point-min))
-           (forward-line)
-           (narrow-to-region (point-min) (point))
+           ;; We cannot use `string-equal', because tramp-adb.el
+           ;; echoes also the sent string.
            (should
-            (string-equal
-             (format "%s\n" (file-name-nondirectory tmp-name))
+            (string-match
+             (format "\\`%s" (regexp-quote (file-name-nondirectory tmp-name)))
              (buffer-string))))
 
        ;; Cleanup.
@@ -4520,8 +4627,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
   (skip-unless (tramp--test-enabled))
   ;; We test it only for the mock-up connection; otherwise there might
   ;; be problems with the used ports.
-  (skip-unless (and (eq tramp-syntax 'default)
-                    (tramp--test-mock-p)))
+  (skip-unless (and (eq tramp-syntax 'default) (tramp--test-mock-p)))
 
   ;; We force a reconnect, in order to have a clean environment.
   (dolist (dir `(,tramp-test-temporary-file-directory
@@ -4566,6 +4672,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
         (tmp-name2 (expand-file-name "foo" tmp-name1))
         (enable-local-variables :all)
         (enable-remote-dir-locals t)
+         (inhibit-message t)
         kill-buffer-query-functions
         connection-local-profile-alist connection-local-criteria-alist)
     (unwind-protect
@@ -4797,6 +4904,7 @@ This tests also `make-symbolic-link', `file-truename' and 
`add-name-to-file'."
           (tmp-name1 (tramp--test-make-temp-name nil quoted))
           (tmp-name2 (expand-file-name "foo" tmp-name1))
           (tramp-remote-process-environment tramp-remote-process-environment)
+           (inhibit-message t)
           (vc-handled-backends
            (with-parsed-tramp-file-name tramp-test-temporary-file-directory nil
              (cond
@@ -4867,23 +4975,25 @@ This tests also `make-symbolic-link', `file-truename' 
and `add-name-to-file'."
       (unwind-protect
          (progn
            ;; Use default `auto-save-file-name-transforms' mechanism.
-           (let (tramp-auto-save-directory)
-             (with-temp-buffer
-               (setq buffer-file-name tmp-name1)
-               (should
-                (string-equal
-                 (make-auto-save-file-name)
-                 ;; This is taken from original `make-auto-save-file-name'.
-                 ;; We call `convert-standard-filename', because on
-                 ;; MS Windows the (local) colons must be replaced by
-                 ;; exclamation marks.
-                 (convert-standard-filename
-                  (expand-file-name
-                   (format
-                    "#%s#"
-                    (subst-char-in-string
-                     ?/ ?! (replace-regexp-in-string "!" "!!" tmp-name1)))
-                   temporary-file-directory))))))
+           ;; It isn't prepared for `separate' syntax.
+           (unless (eq tramp-syntax 'separate)
+             (let (tramp-auto-save-directory)
+               (with-temp-buffer
+                 (setq buffer-file-name tmp-name1)
+                 (should
+                  (string-equal
+                   (make-auto-save-file-name)
+                   ;; This is taken from original `make-auto-save-file-name'.
+                   ;; We call `convert-standard-filename', because on
+                   ;; MS Windows the (local) colons must be replaced by
+                   ;; exclamation marks.
+                   (convert-standard-filename
+                    (expand-file-name
+                     (format
+                      "#%s#"
+                      (subst-char-in-string
+                       ?/ ?! (replace-regexp-in-string "!" "!!" tmp-name1)))
+                     temporary-file-directory)))))))
 
            ;; No mapping.
            (let (tramp-auto-save-directory auto-save-file-name-transforms)
@@ -6002,6 +6112,9 @@ process sentinels.  They shall not disturb each other."
 ;; This test is inspired by Bug#29163.
 (ert-deftest tramp-test45-auto-load ()
   "Check that Tramp autoloads properly."
+  ;; If we use another syntax but `default', Tramp is already loaded
+  ;; due to the `tramp-change-syntax' call.
+  (skip-unless (eq tramp-syntax 'default))
   (skip-unless (tramp--test-enabled))
 
   (let ((default-directory (expand-file-name temporary-file-directory))
@@ -6146,8 +6259,8 @@ Since it unloads Tramp, it shall be the last test to run."
          (not (string-match "unload-hook$" (symbol-name x)))
          (ert-fail (format "`%s' still bound" x)))))
   ;; The defstruct `tramp-file-name' and all its internal functions
-  ;; shall be purged.
-  (should-not (with-no-warnings (cl--find-class 'tramp-file-name)))
+  ;; shall be purged.  `cl--find-class' must be protected in Emacs 24.
+  (with-no-warnings (should-not (cl--find-class 'tramp-file-name)))
   (mapatoms
    (lambda (x)
      (and (functionp x)
diff --git a/texi/tramp.texi b/texi/tramp.texi
index 302599b..061d6cd 100644
--- a/texi/tramp.texi
+++ b/texi/tramp.texi
@@ -4083,6 +4083,31 @@ this @code{nil} setting:
 
 
 @item
+On multi-hop connections, @value{tramp} does not use @command{ssh}
+@code{ControlMaster}
+
+In order to use the @code{ControlMaster} option, @value{tramp} must
+check whether the @command{ssh} client supports this option.  This is
+only possible on the local host, for the first hop.  @value{tramp}
+does not use this option on proxy hosts.
+
+If you want to use this option also for the other hops, you must
+configure @file{~/.ssh/config} on the proxy host:
+
+@example
+@group
+Host *
+     ControlMaster     auto
+     ControlPath       tramp.%C
+     ControlPersist    no
+@end group
+@end example
+
+Check @command{man ssh_config} whether these options are supported on
+your proxy host.
+
+
+@item
 File name completion does not work with @value{tramp}
 
 @acronym{ANSI} escape sequences from the remote shell may cause errors
@@ -4606,6 +4631,12 @@ in @file{.emacs}:
 (customize-set-variable 'tramp-default-method "ftp")
 @end lisp
 
+If you want to enable Ange FTP's syntax, add the following form:
+
+@lisp
+(tramp-change-syntax 'simplified)
+@end lisp
+
 @item
 @vindex tramp-mode
 To disable both @value{tramp} (and Ange FTP), set @code{tramp-mode} to
diff --git a/texi/trampver.texi b/texi/trampver.texi
index c2ccf9b..be35101 100644
--- a/texi/trampver.texi
+++ b/texi/trampver.texi
@@ -8,7 +8,7 @@
 @c In the Tramp GIT, the version numbers are auto-frobbed from
 @c tramp.el, and the bug report address is auto-frobbed from
 @c configure.ac.
-@set trampver 2.4.2.5
+@set trampver 2.4.3
 @set tramp-bug-report-address tramp-devel@@gnu.org
 @set emacsver 24.4
 
diff --git a/tramp-adb.el b/tramp-adb.el
index b56ffdd..300def1 100644
--- a/tramp-adb.el
+++ b/tramp-adb.el
@@ -58,7 +58,7 @@ It is used for TCP/IP devices."
 (defcustom tramp-adb-prompt
   "^[[:digit:]]*|?[[:alnum:]\e;[]*@?[[:alnum:]]*[^#\\$]*[#\\$][[:space:]]"
   "Regexp used as prompt in almquist shell."
-  :type 'string
+  :type 'regexp
   :version "24.4"
   :group 'tramp)
 
@@ -1156,8 +1156,7 @@ the exit status is not equal 0, and t otherwise."
           (format "%s; echo tramp_exit_status $?" command)
         "echo tramp_exit_status $?"))
   (with-current-buffer (tramp-get-connection-buffer vec)
-    (goto-char (point-max))
-    (unless (re-search-backward "tramp_exit_status [0-9]+" nil t)
+    (unless (tramp-search-regexp "tramp_exit_status [0-9]+")
       (tramp-error
        vec 'file-error "Couldn't find exit status of `%s'" command))
     (skip-chars-forward "^ ")
@@ -1191,9 +1190,8 @@ FMT and ARGS are passed to `error'."
             (when (re-search-forward prompt (point-at-eol) t)
               (forward-line 1)
               (delete-region (point-min) (point)))
-           (goto-char (point-max))
-           (re-search-backward prompt nil t)
-           (delete-region (point) (point-max)))
+           (when (tramp-search-regexp prompt)
+             (delete-region (point) (point-max))))
        (if timeout
            (tramp-error
             proc 'file-error
diff --git a/tramp-cmds.el b/tramp-cmds.el
index 96b11c7..607b025 100644
--- a/tramp-cmds.el
+++ b/tramp-cmds.el
@@ -359,7 +359,7 @@ The remote connection identified by SOURCE is flushed by
   ;; Append local file name if none is specified.
   (when (string-equal (file-remote-p target) target)
     (setq target (concat target (file-remote-p source 'localname))))
-  ;; Make them directoy names.
+  ;; Make them directory names.
   (setq source (directory-file-name source)
        target (directory-file-name target))
 
diff --git a/tramp-compat.el b/tramp-compat.el
index 169aced..6c8a3f2 100644
--- a/tramp-compat.el
+++ b/tramp-compat.el
@@ -352,6 +352,11 @@ A nil value for either argument stands for the current 
time."
            (unload-feature 'tramp-loaddefs 'force)
            (unload-feature 'tramp-compat 'force)))
 
+;;; TODO:
+;;
+;; * Starting with Emacs 25.1, replace `tramp-message-show-message' by
+;;   the reverse of `inhibit-message'.
+
 (provide 'tramp-compat)
 
 ;;; tramp-compat.el ends here
diff --git a/tramp-integration.el b/tramp-integration.el
index 0c31076..ad07563 100644
--- a/tramp-integration.el
+++ b/tramp-integration.el
@@ -31,12 +31,20 @@
 
 ;; Pacify byte-compiler.
 (require 'cl-lib)
+(declare-function info-lookup->cache "info-look")
+(declare-function info-lookup->mode-cache "info-look")
+(declare-function info-lookup->mode-value "info-look")
+(declare-function info-lookup->other-modes "info-look")
+(declare-function info-lookup->topic-cache "info-look")
+(declare-function info-lookup->topic-value "info-look")
+(declare-function info-lookup-maybe-add-help "info-look")
 (declare-function recentf-cleanup "recentf")
 (declare-function tramp-dissect-file-name "tramp")
 (declare-function tramp-file-name-equal-p "tramp")
 (declare-function tramp-tramp-file-p "tramp")
 (defvar eshell-path-env)
 (defvar ido-read-file-name-non-ido)
+(defvar info-lookup-alist)
 (defvar ivy-completing-read-handlers-alist)
 (defvar recentf-exclude)
 (defvar tramp-current-connection)
@@ -176,7 +184,13 @@ NAME must be equal to `tramp-current-connection'."
 
 (with-eval-after-load 'ido
   (add-to-list 'ido-read-file-name-non-ido 'tramp-rename-files)
-  (add-to-list 'ido-read-file-name-non-ido 'tramp-these-rename-files))
+  (add-to-list 'ido-read-file-name-non-ido 'tramp-these-rename-files)
+  (add-hook 'tramp-integration-unload-hook
+           (lambda ()
+             (setq ido-read-file-name-non-ido
+                   (delq 'tramp-these-rename-files ido-read-file-name-non-ido)
+                   ido-read-file-name-non-ido
+                   (delq 'tramp-rename-files ido-read-file-name-non-ido)))))
 
 ;;; Integration of ivy.el:
 
@@ -184,7 +198,68 @@ NAME must be equal to `tramp-current-connection'."
   (add-to-list 'ivy-completing-read-handlers-alist
               '(tramp-rename-files . completing-read-default))
   (add-to-list 'ivy-completing-read-handlers-alist
-              '(tramp-these-rename-files . completing-read-default)))
+              '(tramp-these-rename-files . completing-read-default))
+  (add-hook
+   'tramp-integration-unload-hook
+   (lambda ()
+     (setq ivy-completing-read-handlers-alist
+          (delete
+           (assq 'tramp-these-rename-files ivy-completing-read-handlers-alist)
+           ivy-completing-read-handlers-alist)
+          ivy-completing-read-handlers-alist
+          (delete
+           (assq 'tramp-rename-files ivy-completing-read-handlers-alist)
+           ivy-completing-read-handlers-alist)))))
+
+;;; Integration of info-look.el:
+
+(with-eval-after-load 'info-look
+  ;; Create a pseudo mode `tramp-info-lookup-mode' for Tramp symbol lookup.
+  (info-lookup-maybe-add-help
+   :mode 'tramp-info-lookup-mode :topic 'symbol
+   :regexp "[^][()`'‘’,\" \t\n]+"
+   :doc-spec '(("(tramp)Function Index" nil "^ -+ .*: " "\\( \\|$\\)")
+              ("(tramp)Variable Index" nil "^ -+ .*: " "\\( \\|$\\)")))
+
+  (add-hook
+   'tramp-integration-unload-hook
+   (lambda ()
+     (setcdr (assq 'symbol info-lookup-alist)
+            (delete (info-lookup->mode-value 'symbol 'tramp-info-lookup-mode)
+                    (info-lookup->topic-value 'symbol)))
+     (setcdr (info-lookup->cache 'symbol)
+            (delete (info-lookup->mode-cache 'symbol 'tramp-info-lookup-mode)
+                    (info-lookup->topic-cache 'symbol)))))
+
+  (dolist (mode (mapcar 'car (info-lookup->topic-value 'symbol)))
+    ;; Add `tramp-info-lookup-mode' to `other-modes' for either
+    ;; `emacs-lisp-mode' itself, or to modes which use
+    ;; `emacs-lisp-mode' as `other-modes'.  Reset `info-lookup-cache'.
+    (when (and (or (equal mode 'emacs-lisp-mode)
+                  (memq
+                   'emacs-lisp-mode (info-lookup->other-modes 'symbol mode)))
+              (not (memq 'tramp-info-lookup-mode
+                         (info-lookup->other-modes 'symbol mode))))
+      (setcdr (info-lookup->mode-value 'symbol mode)
+             (append (butlast (cdr (info-lookup->mode-value 'symbol mode)))
+                     `((tramp-info-lookup-mode
+                        . ,(info-lookup->other-modes 'symbol mode)))))
+      (setcdr (info-lookup->cache 'symbol)
+             (delete (info-lookup->mode-cache 'symbol mode)
+                     (info-lookup->topic-cache 'symbol)))
+
+      (add-hook
+       'tramp-integration-unload-hook
+       `(lambda ()
+         (setcdr (info-lookup->mode-value 'symbol ',mode)
+                 (append (butlast
+                          (cdr (info-lookup->mode-value 'symbol ',mode)))
+                         (list
+                          (delq 'tramp-info-lookup-mode
+                                (info-lookup->other-modes 'symbol ',mode)))))
+         (setcdr (info-lookup->cache 'symbol)
+                 (delete (info-lookup->mode-cache 'symbol ',mode)
+                         (info-lookup->topic-cache 'symbol))))))))
 
 ;;; Default connection-local variables for Tramp:
 
diff --git a/tramp-loaddefs.el b/tramp-loaddefs.el
index 50fbb47..cfa7d1a 100644
--- a/tramp-loaddefs.el
+++ b/tramp-loaddefs.el
@@ -653,7 +653,7 @@ UU-encode the region between BEG and END.
 ;;;### (autoloads nil "trampver" "trampver.el" (0 0 0 0))
 ;;; Generated autoloads from trampver.el
 
-(defconst tramp-version "2.4.2.5" "\
+(defconst tramp-version "2.4.3" "\
 This version of Tramp.")
 
 (defconst tramp-bug-report-address "address@hidden" "\
diff --git a/tramp-sh.el b/tramp-sh.el
index 59a93a8..506c33d 100644
--- a/tramp-sh.el
+++ b/tramp-sh.el
@@ -3463,91 +3463,97 @@ the result will be a local, non-Tramp, file name."
 ;; can reset the file name handlers, and we make a second run of
 ;; `vc-registered', which returns the expected result without sending
 ;; any other remote command.
+;; When called during `revert-buffer', it shouldn't spam the echo area
+;; and the *Messages* buffer.
 (defun tramp-sh-handle-vc-registered (file)
   "Like `vc-registered' for Tramp files."
   (when vc-handled-backends
-    (with-temp-message ""
-      (with-parsed-tramp-file-name file nil
-        (with-tramp-progress-reporter
-           v 3 (format-message "Checking `vc-registered' for %s" file)
-
-         ;; There could be new files, created by the vc backend.  We
-         ;; cannot reuse the old cache entries, therefore.  In
-         ;; `tramp-get-file-property', `remote-file-name-inhibit-cache'
-         ;; could also be a timestamp as `current-time' returns.  This
-         ;; means invalidate all cache entries with an older timestamp.
-         (let (tramp-vc-registered-file-names
-               (remote-file-name-inhibit-cache (current-time))
-               (file-name-handler-alist
-                `((,tramp-file-name-regexp . tramp-vc-file-name-handler))))
-
-           ;; Here we collect only file names, which need an operation.
-           (tramp-with-demoted-errors
-               v "Error in 1st pass of `vc-registered': %s"
-             (tramp-run-real-handler #'vc-registered (list file)))
-           (tramp-message v 10 "\n%s" tramp-vc-registered-file-names)
-
-           ;; Send just one command, in order to fill the cache.
-           (when tramp-vc-registered-file-names
-             (tramp-maybe-send-script
-              v
-              (format tramp-vc-registered-read-file-names
-                      (tramp-get-file-exists-command v)
-                      (format "%s -r" (tramp-get-test-command v)))
-              "tramp_vc_registered_read_file_names")
-
-             (dolist
-                 (elt
-                  (ignore-errors
-                    ;; We cannot use `tramp-send-command-and-read',
-                    ;; because this does not cooperate well with
-                    ;; heredoc documents.
-                    (tramp-send-command
-                     v
-                     (format
-                      "tramp_vc_registered_read_file_names <<'%s'\n%s\n%s\n"
-                      tramp-end-of-heredoc
-                      (mapconcat #'tramp-shell-quote-argument
-                                 tramp-vc-registered-file-names
-                                 "\n")
-                      tramp-end-of-heredoc))
-                    (with-current-buffer (tramp-get-connection-buffer v)
-                      ;; Read the expression.
-                      (goto-char (point-min))
-                      (read (current-buffer)))))
-
-               (tramp-set-file-property
-                v (car elt) (cadr elt) (cadr (cdr elt))))))
-
-         ;; Second run.  Now all `file-exists-p' or `file-readable-p'
-         ;; calls shall be answered from the file cache.  We unset
-         ;; `process-file-side-effects' and `remote-file-name-inhibit-cache'
-         ;; in order to keep the cache.
-         (let ((vc-handled-backends vc-handled-backends)
-               remote-file-name-inhibit-cache process-file-side-effects)
-           ;; Reduce `vc-handled-backends' in order to minimize process calls.
-           (when (and (memq 'Bzr vc-handled-backends)
-                      (boundp 'vc-bzr-program)
-                      (not (with-tramp-connection-property v vc-bzr-program
-                             (tramp-find-executable
-                              v vc-bzr-program (tramp-get-remote-path v)))))
-             (setq vc-handled-backends (remq 'Bzr vc-handled-backends)))
-           (when (and (memq 'Git vc-handled-backends)
-                      (boundp 'vc-git-program)
-                      (not (with-tramp-connection-property v vc-git-program
-                             (tramp-find-executable
-                              v vc-git-program (tramp-get-remote-path v)))))
-             (setq vc-handled-backends (remq 'Git vc-handled-backends)))
-           (when (and (memq 'Hg vc-handled-backends)
-                      (boundp 'vc-hg-program)
-                      (not (with-tramp-connection-property v vc-hg-program
-                             (tramp-find-executable
-                              v vc-hg-program (tramp-get-remote-path v)))))
-             (setq vc-handled-backends (remq 'Hg vc-handled-backends)))
-           ;; Run.
-           (tramp-with-demoted-errors
-               v "Error in 2nd pass of `vc-registered': %s"
-             (tramp-run-real-handler #'vc-registered (list file)))))))))
+    (let ((tramp-message-show-message
+          (and (not revert-buffer-in-progress-p) tramp-message-show-message))
+         (temp-message (unless revert-buffer-in-progress-p "")))
+      (with-temp-message temp-message
+       (with-parsed-tramp-file-name file nil
+          (with-tramp-progress-reporter
+             v 3 (format-message "Checking `vc-registered' for %s" file)
+
+           ;; There could be new files, created by the vc backend.
+           ;; We cannot reuse the old cache entries, therefore.  In
+           ;; `tramp-get-file-property', `remote-file-name-inhibit-cache'
+           ;; could also be a timestamp as `current-time' returns.  This
+           ;; means invalidate all cache entries with an older timestamp.
+           (let (tramp-vc-registered-file-names
+                 (remote-file-name-inhibit-cache (current-time))
+                 (file-name-handler-alist
+                  `((,tramp-file-name-regexp . tramp-vc-file-name-handler))))
+
+             ;; Here we collect only file names, which need an operation.
+             (tramp-with-demoted-errors
+                 v "Error in 1st pass of `vc-registered': %s"
+               (tramp-run-real-handler #'vc-registered (list file)))
+             (tramp-message v 10 "\n%s" tramp-vc-registered-file-names)
+
+             ;; Send just one command, in order to fill the cache.
+             (when tramp-vc-registered-file-names
+               (tramp-maybe-send-script
+                v
+                (format tramp-vc-registered-read-file-names
+                        (tramp-get-file-exists-command v)
+                        (format "%s -r" (tramp-get-test-command v)))
+                "tramp_vc_registered_read_file_names")
+
+               (dolist
+                   (elt
+                    (ignore-errors
+                      ;; We cannot use `tramp-send-command-and-read',
+                      ;; because this does not cooperate well with
+                      ;; heredoc documents.
+                      (tramp-send-command
+                       v
+                       (format
+                        "tramp_vc_registered_read_file_names <<'%s'\n%s\n%s\n"
+                        tramp-end-of-heredoc
+                        (mapconcat #'tramp-shell-quote-argument
+                                   tramp-vc-registered-file-names
+                                   "\n")
+                        tramp-end-of-heredoc))
+                      (with-current-buffer (tramp-get-connection-buffer v)
+                        ;; Read the expression.
+                        (goto-char (point-min))
+                        (read (current-buffer)))))
+
+                 (tramp-set-file-property
+                  v (car elt) (cadr elt) (cadr (cdr elt))))))
+
+           ;; Second run.  Now all `file-exists-p' or `file-readable-p'
+           ;; calls shall be answered from the file cache.  We unset
+           ;; `process-file-side-effects' and `remote-file-name-inhibit-cache'
+           ;; in order to keep the cache.
+           (let ((vc-handled-backends vc-handled-backends)
+                 remote-file-name-inhibit-cache process-file-side-effects)
+             ;; Reduce `vc-handled-backends' in order to minimize
+             ;; process calls.
+             (when (and (memq 'Bzr vc-handled-backends)
+                        (boundp 'vc-bzr-program)
+                        (not (with-tramp-connection-property v vc-bzr-program
+                               (tramp-find-executable
+                                v vc-bzr-program (tramp-get-remote-path v)))))
+               (setq vc-handled-backends (remq 'Bzr vc-handled-backends)))
+             (when (and (memq 'Git vc-handled-backends)
+                        (boundp 'vc-git-program)
+                        (not (with-tramp-connection-property v vc-git-program
+                               (tramp-find-executable
+                                v vc-git-program (tramp-get-remote-path v)))))
+               (setq vc-handled-backends (remq 'Git vc-handled-backends)))
+             (when (and (memq 'Hg vc-handled-backends)
+                        (boundp 'vc-hg-program)
+                        (not (with-tramp-connection-property v vc-hg-program
+                               (tramp-find-executable
+                                v vc-hg-program (tramp-get-remote-path v)))))
+               (setq vc-handled-backends (remq 'Hg vc-handled-backends)))
+             ;; Run.
+             (tramp-with-demoted-errors
+                 v "Error in 2nd pass of `vc-registered': %s"
+               (tramp-run-real-handler #'vc-registered (list file))))))))))
 
 ;;;###tramp-autoload
 (defun tramp-sh-file-name-handler (operation &rest args)
@@ -3799,7 +3805,7 @@ Fall back to normal file name handler if no Tramp handler 
exists."
       (unless (string-match
               (eval-when-compile
                 (concat "^[^[:blank:]]+"
-                        "[[:blank:]]+\\([^[:blank:]]+\\)+"
+                        "[[:blank:]]+\\([^[:blank:]]+\\)"
                         "\\([[:blank:]]+\\([^\n\r]+\\)\\)?"))
               line)
        (tramp-error proc 'file-notify-error "%s" line))
@@ -5096,9 +5102,8 @@ function waits for output unless NOOUTPUT is set."
              (forward-line 1)
              (delete-region (point-min) (point)))
            ;; Delete the prompt.
-           (goto-char (point-max))
-           (re-search-backward regexp nil t)
-           (delete-region (point) (point-max)))
+           (when (tramp-search-regexp regexp)
+             (delete-region (point) (point-max))))
        (if timeout
            (tramp-error
             proc 'file-error
@@ -5128,8 +5133,7 @@ DONT-SUPPRESS-ERR is non-nil, stderr won't be sent to 
/dev/null."
           "echo tramp_exit_status $?"
           (if subshell " )" "")))
   (with-current-buffer (tramp-get-connection-buffer vec)
-    (goto-char (point-max))
-    (unless (re-search-backward "tramp_exit_status [0-9]+" nil t)
+    (unless (tramp-search-regexp "tramp_exit_status [0-9]+")
       (tramp-error
        vec 'file-error "Couldn't find exit status of `%s'" command))
     (skip-chars-forward "^ ")
diff --git a/tramp-smb.el b/tramp-smb.el
index 38149da..1a4b63d 100644
--- a/tramp-smb.el
+++ b/tramp-smb.el
@@ -1451,11 +1451,10 @@ component is used as the target of the symlink."
                  (process-put p 'adjust-window-size-function #'ignore)
                  (set-process-query-on-exit-flag p nil)
                  (tramp-process-actions p v nil tramp-smb-actions-set-acl)
-                 (goto-char (point-max))
                  ;; This is meant for traces, and returning from the
                  ;; function.  No error is propagated outside, due to
                  ;; the `ignore-errors' closure.
-                 (unless (re-search-backward "tramp_exit_status [0-9]+" nil t)
+                 (unless (tramp-search-regexp "tramp_exit_status [0-9]+")
                    (tramp-error
                     v 'file-error
                     "Couldn't find exit status of `%s'" tramp-smb-acl-program))
diff --git a/tramp.el b/tramp.el
index c81eaf3..79cc042 100644
--- a/tramp.el
+++ b/tramp.el
@@ -7,8 +7,9 @@
 ;; Maintainer: Michael Albinus <address@hidden>
 ;; Keywords: comm, processes
 ;; Package: tramp
-;; Version: 2.4.2.5
+;; Version: 2.4.3
 ;; Package-Requires: ((emacs "24.4"))
+;; Package-Type: multi
 ;; URL: https://savannah.gnu.org/projects/tramp
 
 ;; This file is part of GNU Emacs.
@@ -1019,7 +1020,7 @@ See also `tramp-file-name-regexp'.")
   (car tramp-file-name-structure))
 
 ;;;###autoload
-(defconst tramp-initial-file-name-regexp "\\`/.+:.*:"
+(defconst tramp-initial-file-name-regexp "\\`/[^/:]+:[^/:]*:"
   "Value for `tramp-file-name-regexp' for autoload.
 It must match the initial `tramp-syntax' settings.")
 
@@ -3292,10 +3293,16 @@ User is always nil."
 (defun tramp-handle-file-name-completion
   (filename directory &optional predicate)
   "Like `file-name-completion' for Tramp files."
-  (let (hits-ignored-extensions)
+  (let (hits-ignored-extensions fnac)
+    (setq fnac (file-name-all-completions filename directory))
+    ;; "." and ".." are never interesting as completions, and are
+    ;; actually in the way in a directory with only one file.  See
+    ;; file_name_completion() in dired.c.
+    (when (and (consp fnac) (= (length (delete "./" (delete "../" fnac))) 1))
+      (setq fnac (delete "./" (delete "../" fnac))))
     (or
      (try-completion
-      filename (file-name-all-completions filename directory)
+      filename fnac
       (lambda (x)
        (when (funcall (or predicate #'identity) (expand-file-name x directory))
          (not
@@ -3708,7 +3715,9 @@ support symbolic links."
 
     (setq buffer (if (and (not asynchronous) error-buffer)
                     (with-parsed-tramp-file-name default-directory nil
-                      (list output-buffer (tramp-make-tramp-temp-file v)))
+                      (list output-buffer
+                            (tramp-make-tramp-file-name
+                             v (tramp-make-tramp-temp-file v))))
                   output-buffer))
 
     (if current-buffer-p
@@ -3762,7 +3771,7 @@ support symbolic links."
 
 (defun tramp-handle-start-file-process (name buffer program &rest args)
   "Like `start-file-process' for Tramp files."
-  ;; `make-process' knows the `:file-error' argument since Emacs 27.1.
+  ;; `make-process' knows the `:file-handler' argument since Emacs 27.1 only.
   (tramp-file-name-handler
    'make-process
    :name name
@@ -4196,19 +4205,36 @@ for process communication also."
        (buffer-string))
       result)))
 
+(defun tramp-search-regexp (regexp)
+  "Search for REGEXP backwards, starting at point-max.
+If found, set point to the end of the occurrence found, and return point.
+Otherwise, return nil."
+  (goto-char (point-max))
+  ;; We restrict ourselves to the last 256 characters.  There were
+  ;; reports of a shell command "git ls-files -zco --exclude-standard"
+  ;; with 85k files involved, which has blocked Tramp forever.
+  (re-search-backward regexp (max (point-min) (- (point) 256)) 'noerror))
+
 (defun tramp-check-for-regexp (proc regexp)
   "Check, whether REGEXP is contained in process buffer of PROC.
 Erase echoed commands if exists."
   (with-current-buffer (process-buffer proc)
     (goto-char (point-min))
 
-    ;; Check whether we need to remove echo output.
+    ;; Check whether we need to remove echo output.  The max length of
+    ;; the echo mark regexp is taken for search.  We restrict the
+    ;; search for the second echo mark to PIPE_BUF characters.
     (when (and (tramp-get-connection-property proc "check-remote-echo" nil)
-              (re-search-forward tramp-echoed-echo-mark-regexp nil t))
+              (re-search-forward
+               tramp-echoed-echo-mark-regexp
+               (+ (point) (* 5 tramp-echo-mark-marker-length)) t))
       (let ((begin (match-beginning 0)))
-       (when (re-search-forward tramp-echoed-echo-mark-regexp nil t)
+       (when
+           (re-search-forward
+            tramp-echoed-echo-mark-regexp
+            (+ (point) (tramp-get-connection-property proc "pipe-buf" 4096)) t)
          ;; Discard echo from remote output.
-         (tramp-set-connection-property proc "check-remote-echo" nil)
+         (tramp-flush-connection-property proc "check-remote-echo")
          (tramp-message proc 5 "echo-mark found")
          (forward-line 1)
          (delete-region begin (point))
@@ -4229,8 +4255,7 @@ Erase echoed commands if exists."
       ;; overflow in regexp matcher".  For example, //DIRED// lines of
       ;; directory listings with some thousand files.  Therefore, we
       ;; look from the end.
-      (goto-char (point-max))
-      (ignore-errors (re-search-backward regexp nil t)))))
+      (tramp-search-regexp regexp))))
 
 (defun tramp-wait-for-regexp (proc timeout regexp)
   "Wait for a REGEXP to appear from process PROC within TIMEOUT seconds.
@@ -4312,15 +4337,16 @@ the remote host use line-endings as defined in the 
variable
   "Flush file caches and remove shell prompt."
   (unless (process-live-p proc)
     (let ((vec (process-get proc 'vector))
+         (buf (process-buffer proc))
          (prompt (tramp-get-connection-property proc "prompt" nil)))
       (when vec
        (tramp-message vec 5 "Sentinel called: `%S' `%s'" proc event)
         (tramp-flush-connection-properties proc)
         (tramp-flush-directory-properties vec ""))
-      (with-current-buffer (process-buffer proc)
-        (goto-char (point-max))
-        (when (and prompt (re-search-backward (regexp-quote prompt) nil t))
-         (delete-region (point) (point-max)))))))
+      (when (buffer-live-p buf)
+       (with-current-buffer buf
+          (when (and prompt (tramp-search-regexp (regexp-quote prompt)))
+           (delete-region (point) (point-max))))))))
 
 (defun tramp-get-inode (vec)
   "Return the virtual inode number.
@@ -4987,12 +5013,14 @@ name of a process or buffer, or nil to default to the 
current buffer."
 ;; - Reset `file-name-handler-alist'
 ;; - Cleanup hooks where Tramp functions are in
 ;; - Cleanup autoloads
+;; We must autoload the function body.  Otherwise, Tramp would be
+;; loaded unconditionally if somebody calls `tramp-unload-tramp'.
 ;;;###autoload
-(defun tramp-unload-tramp ()
+(progn (defun tramp-unload-tramp ()
   "Discard Tramp from loading remote files."
   (interactive)
   ;; Maybe it's not loaded yet.
-  (ignore-errors (unload-feature 'tramp 'force)))
+  (ignore-errors (unload-feature 'tramp 'force))))
 
 (provide 'tramp)
 
diff --git a/tramp.info b/tramp.info
index c973fef..3e66ced 100644
--- a/tramp.info
+++ b/tramp.info
@@ -21,10 +21,10 @@ END-INFO-DIR-ENTRY
 
 File: tramp.info,  Node: Top,  Next: Overview,  Prev: (dir),  Up: (dir)
 
-TRAMP 2.4.2.5 User Manual
-*************************
+TRAMP 2.4.3 User Manual
+***********************
 
-This file documents TRAMP 2.4.2.5, a remote file editing package for
+This file documents TRAMP 2.4.3, a remote file editing package for
 Emacs.
 
    TRAMP stands for “Transparent Remote (file) Access, Multiple
@@ -3037,6 +3037,24 @@ File: tramp.info,  Node: Frequently Asked Questions,  
Next: Files directories an
 
           (customize-set-variable 'tramp-use-ssh-controlmaster-options nil)
 
+   • On multi-hop connections, TRAMP does not use ‘ssh’ ‘ControlMaster’
+
+     In order to use the ‘ControlMaster’ option, TRAMP must check
+     whether the ‘ssh’ client supports this option.  This is only
+     possible on the local host, for the first hop.  TRAMP does not use
+     this option on proxy hosts.
+
+     If you want to use this option also for the other hops, you must
+     configure ‘~/.ssh/config’ on the proxy host:
+
+          Host *
+               ControlMaster   auto
+               ControlPath     tramp.%C
+               ControlPersist  no
+
+     Check ‘man ssh_config’ whether these options are supported on your
+     proxy host.
+
    • File name completion does not work with TRAMP
 
      ANSI escape sequences from the remote shell may cause errors in
@@ -3421,6 +3439,11 @@ File: tramp.info,  Node: Frequently Asked Questions,  
Next: Files directories an
 
                (customize-set-variable 'tramp-default-method "ftp")
 
+          If you want to enable Ange FTP’s syntax, add the following
+          form:
+
+               (tramp-change-syntax 'simplified)
+
         − To disable both TRAMP (and Ange FTP), set ‘tramp-mode’ to
           ‘nil’ in ‘.emacs’.  *Note*, that we don’t use
           ‘customize-set-variable’, in order to avoid loading TRAMP.
@@ -4124,17 +4147,17 @@ Variable Index
 * customize-package-emacs-version-alist: Obtaining TRAMP.     (line  20)
 * DISPLAY, environment variable:         Remote processes.    (line  93)
 * EDITOR, environment variable:          Frequently Asked Questions.
-                                                              (line 540)
+                                                              (line 558)
 * ENV, environment variable:             Remote processes.    (line  64)
 * ESHELL, environment variable:          Remote shell setup.  (line 187)
 * HGPLAIN, environment variable:         Remote processes.    (line  82)
 * HISTFILE, environment variable:        Frequently Asked Questions.
-                                                              (line 281)
+                                                              (line 299)
 * HISTFILESIZE, environment variable:    Frequently Asked Questions.
-                                                              (line 281)
+                                                              (line 299)
 * HISTORY, environment variable:         Remote processes.    (line  52)
 * HISTSIZE, environment variable:        Frequently Asked Questions.
-                                                              (line 281)
+                                                              (line 299)
 * INSIDE_EMACS, environment variable:    Remote shell setup.  (line 104)
 * INSIDE_EMACS, environment variable <1>: Remote shell setup. (line 187)
 * non-essential:                         External packages.   (line   9)
@@ -4184,16 +4207,16 @@ Variable Index
                                                               (line  28)
 * tramp-gvfs-methods:                    GVFS-based methods.  (line  60)
 * tramp-histfile-override:               Frequently Asked Questions.
-                                                              (line 281)
+                                                              (line 299)
 * tramp-ignored-file-name-regexp:        Frequently Asked Questions.
-                                                              (line 597)
+                                                              (line 620)
 * tramp-inline-compress-commands:        Inline methods.      (line  25)
 * tramp-inline-compress-start-size:      Inline methods.      (line  25)
 * tramp-local-host-regexp:               Frequently Asked Questions.
                                                               (line 165)
 * tramp-methods:                         Customizing Methods. (line   6)
 * tramp-mode:                            Frequently Asked Questions.
-                                                              (line 591)
+                                                              (line 614)
 * tramp-own-remote-path:                 Remote programs.     (line  32)
 * tramp-password-prompt-regexp:          Remote shell setup.  (line  65)
 * tramp-persistency-file-name:           Connection caching.  (line   6)
@@ -4209,7 +4232,7 @@ Variable Index
                                                               (line 188)
 * tramp-terminal-type:                   Remote shell setup.  (line  90)
 * tramp-theme-face-remapping-alist:      Frequently Asked Questions.
-                                                              (line 261)
+                                                              (line 279)
 * tramp-use-ssh-controlmaster-options:   Frequently Asked Questions.
                                                               (line 201)
 * tramp-verbose:                         Traces and Profiles. (line   6)
@@ -4526,7 +4549,7 @@ Concept Index
 * tgz file archive suffix:               Archive file names.  (line  71)
 * tlz file archive suffix:               Archive file names.  (line  71)
 * TRAMP theme:                           Frequently Asked Questions.
-                                                              (line 261)
+                                                              (line 279)
 * tset unix command:                     Remote shell setup.  (line 124)
 * txz file archive suffix:               Archive file names.  (line  71)
 * type-ahead:                            Usage.               (line  12)
@@ -4550,61 +4573,61 @@ Concept Index
 
 Tag Table:
 Node: Top933
-Node: Overview5421
-Node: Obtaining TRAMP10755
-Node: Quick Start Guide13202
-Ref: Quick Start Guide: File name syntax13979
-Ref: Quick Start Guide: ssh and plink methods15081
-Ref: Quick Start Guide: su, sudo and sg methods15625
-Ref: Quick Start Guide: ssh, plink, su, sudo and sg methods16189
-Ref: Quick Start Guide: sudoedit method16719
-Ref: Quick Start Guide: smb method17130
-Ref: Quick Start Guide: GVFS-based methods17461
-Ref: Quick Start Guide: GNOME Online Accounts based methods17857
-Ref: Quick Start Guide: Android18399
-Ref: Quick Start Guide: rclone method18631
-Node: Configuration18958
-Node: Connection types21430
-Node: Inline methods22844
-Node: External methods27806
-Node: GVFS-based methods38444
-Node: Default Method41713
-Node: Default User44730
-Node: Default Host46259
-Node: Multi-hops47391
-Node: Firewalls51583
-Node: Customizing Methods53040
-Node: Customizing Completion55380
-Node: Password handling58870
-Ref: Using an authentication file59340
-Ref: Caching passwords60842
-Node: Connection caching61360
-Node: Predefined connection information62290
-Node: Remote programs66164
-Node: Remote shell setup69085
-Node: Android shell setup78701
-Node: Auto-save and Backup81088
-Node: Windows setup hints84163
-Node: Usage85783
-Node: File name syntax87136
-Node: Change file name syntax89143
-Node: File name completion90574
-Node: Ad-hoc multi-hops93729
-Node: Remote processes95795
-Ref: Running a debugger on a remote host104553
-Node: Cleanup remote connections106523
-Node: Renaming remote files108224
-Node: Archive file names112443
-Node: Bug Reports116808
-Node: Frequently Asked Questions119190
-Node: Files directories and localnames142269
-Node: Localname deconstruction142705
-Node: External packages143358
-Node: Traces and Profiles145403
-Node: GNU Free Documentation License147372
-Node: Function Index172743
-Node: Variable Index175621
-Node: Concept Index183230
+Node: Overview5415
+Node: Obtaining TRAMP10749
+Node: Quick Start Guide13196
+Ref: Quick Start Guide: File name syntax13973
+Ref: Quick Start Guide: ssh and plink methods15075
+Ref: Quick Start Guide: su, sudo and sg methods15619
+Ref: Quick Start Guide: ssh, plink, su, sudo and sg methods16183
+Ref: Quick Start Guide: sudoedit method16713
+Ref: Quick Start Guide: smb method17124
+Ref: Quick Start Guide: GVFS-based methods17455
+Ref: Quick Start Guide: GNOME Online Accounts based methods17851
+Ref: Quick Start Guide: Android18393
+Ref: Quick Start Guide: rclone method18625
+Node: Configuration18952
+Node: Connection types21424
+Node: Inline methods22838
+Node: External methods27800
+Node: GVFS-based methods38438
+Node: Default Method41707
+Node: Default User44724
+Node: Default Host46253
+Node: Multi-hops47385
+Node: Firewalls51577
+Node: Customizing Methods53034
+Node: Customizing Completion55374
+Node: Password handling58864
+Ref: Using an authentication file59334
+Ref: Caching passwords60836
+Node: Connection caching61354
+Node: Predefined connection information62284
+Node: Remote programs66158
+Node: Remote shell setup69079
+Node: Android shell setup78695
+Node: Auto-save and Backup81082
+Node: Windows setup hints84157
+Node: Usage85777
+Node: File name syntax87130
+Node: Change file name syntax89137
+Node: File name completion90568
+Node: Ad-hoc multi-hops93723
+Node: Remote processes95789
+Ref: Running a debugger on a remote host104547
+Node: Cleanup remote connections106517
+Node: Renaming remote files108218
+Node: Archive file names112437
+Node: Bug Reports116802
+Node: Frequently Asked Questions119184
+Node: Files directories and localnames143070
+Node: Localname deconstruction143506
+Node: External packages144159
+Node: Traces and Profiles146204
+Node: GNU Free Documentation License148173
+Node: Function Index173544
+Node: Variable Index176422
+Node: Concept Index184031
 
 End Tag Table
 
diff --git a/trampver.el b/trampver.el
index d13d5f9..9c04b61 100644
--- a/trampver.el
+++ b/trampver.el
@@ -35,8 +35,11 @@
 ;; Emacs version check is defined in macro AC_EMACS_INFO of
 ;; aclocal.m4; should be changed only there.
 
+;; Needed for Emacs 24.
+(defvar inhibit-message)
+
 ;;;###tramp-autoload
-(defconst tramp-version "2.4.2.5"
+(defconst tramp-version "2.4.3"
   "This version of Tramp.")
 
 ;;;###tramp-autoload
@@ -70,7 +73,7 @@
 ;; Check for Emacs version.
 (let ((x   (if (not (string-lessp emacs-version "24.4"))
       "ok"
-    (format "Tramp 2.4.2.5 is not fit for %s"
+    (format "Tramp 2.4.3 is not fit for %s"
             (replace-regexp-in-string "\n" "" (emacs-version))))))
   (unless (string-equal "ok" x) (error "%s" x)))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]