]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve Tramp's user and host name completion
authorMichael Albinus <michael.albinus@gmx.de>
Sat, 18 Feb 2023 17:27:56 +0000 (18:27 +0100)
committerMichael Albinus <michael.albinus@gmx.de>
Sat, 18 Feb 2023 17:27:56 +0000 (18:27 +0100)
* lisp/net/tramp.el (tramp-completion-handle-file-exists-p):
Improve user name completion.
(tramp-skeleton-file-exists-p): New defmacro, which also handles
host name completion.
(tramp-handle-file-exists-p):
* lisp/net/tramp-adb.el (tramp-adb-handle-file-exists-p):
* lisp/net/tramp-sh.el (tramp-sh-handle-file-exists-p):
* lisp/net/tramp-sudoedit.el (tramp-sudoedit-handle-file-exists-p):
Use it.

lisp/net/tramp-adb.el
lisp/net/tramp-sh.el
lisp/net/tramp-sudoedit.el
lisp/net/tramp.el

index 38fd8a4e258cf5cc02ee7f1915c62ad2d7f9eb57..f8c38859477257663dc1d7a2630f99b34d96a13b 100644 (file)
@@ -487,16 +487,9 @@ Emacs dired can't find files."
 
 (defun tramp-adb-handle-file-exists-p (filename)
   "Like `file-exists-p' for Tramp files."
-  ;; `file-exists-p' is used as predicate in file name completion.
-  ;; We don't want to run it when `non-essential' is t, or there is
-  ;; no connection process yet.
-  (when (tramp-connectable-p filename)
-    (with-parsed-tramp-file-name (expand-file-name filename) nil
-      (with-tramp-file-property v localname "file-exists-p"
-       (if (tramp-file-property-p v localname "file-attributes")
-           (not (null (tramp-get-file-property v localname "file-attributes")))
-         (tramp-adb-send-command-and-check
-          v (format "test -e %s" (tramp-shell-quote-argument localname))))))))
+  (tramp-skeleton-file-exists-p filename
+    (tramp-adb-send-command-and-check
+     v (format "test -e %s" (tramp-shell-quote-argument localname)))))
 
 (defun tramp-adb-handle-file-readable-p (filename)
   "Like `file-readable-p' for Tramp files."
index 7a6c9658aa914a990e45beff1955bad3c78d58f7..b3d837f95142167645f6bd4c66450991b4cda387 100644 (file)
@@ -1186,20 +1186,13 @@ Operations not mentioned here will be handled by the normal Emacs functions.")
 
 (defun tramp-sh-handle-file-exists-p (filename)
   "Like `file-exists-p' for Tramp files."
-  ;; `file-exists-p' is used as predicate in file name completion.
-  ;; We don't want to run it when `non-essential' is t, or there is
-  ;; no connection process yet.
-  (when (tramp-connectable-p filename)
-    (with-parsed-tramp-file-name (expand-file-name filename) nil
-      (with-tramp-file-property v localname "file-exists-p"
-       (if (tramp-file-property-p v localname "file-attributes")
-           (not (null (tramp-get-file-property v localname "file-attributes")))
-         (tramp-send-command-and-check
-          v
-          (format
-           "%s %s"
-           (tramp-get-file-exists-command v)
-           (tramp-shell-quote-argument localname))))))))
+  (tramp-skeleton-file-exists-p filename
+    (tramp-send-command-and-check
+     v
+     (format
+      "%s %s"
+      (tramp-get-file-exists-command v)
+      (tramp-shell-quote-argument localname)))))
 
 (defun tramp-sh-handle-file-attributes (filename &optional id-format)
   "Like `file-attributes' for Tramp files."
index 1f646253579e256a6ddf403e7c296f407b055173..fa1689d6851ac74cac660b1c44b47a680510b5a0 100644 (file)
@@ -454,16 +454,9 @@ the result will be a local, non-Tramp, file name."
 
 (defun tramp-sudoedit-handle-file-exists-p (filename)
   "Like `file-exists-p' for Tramp files."
-  ;; `file-exists-p' is used as predicate in file name completion.
-  ;; We don't want to run it when `non-essential' is t, or there is
-  ;; no connection process yet.
-  (when (tramp-connectable-p filename)
-    (with-parsed-tramp-file-name (expand-file-name filename) nil
-      (with-tramp-file-property v localname "file-exists-p"
-       (if (tramp-file-property-p v localname "file-attributes")
-           (not (null (tramp-get-file-property v localname "file-attributes")))
-         (tramp-sudoedit-send-command
-          v "test" "-e" (file-name-unquote localname)))))))
+  (tramp-skeleton-file-exists-p filename
+    (tramp-sudoedit-send-command
+     v "test" "-e" (file-name-unquote localname))))
 
 (defun tramp-sudoedit-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
index 95b42fb1c43008746ba4c71812ec9aeda40a9e6a..baa9f966dd8245ea39bdedfdd40df709ee3a88a1 100644 (file)
@@ -2976,8 +2976,9 @@ not in completion mode."
   ;; We need special handling only when a method is needed.  Then we
   ;; regard all files "/method:" or "/[method/" as existent, if
   ;; "method" is a valid Tramp method.  And we regard all files
-  ;; "/method:user@host" or "/[method/user@host" as existent, if
-  ;; "user@host" is a valid file name completion.
+  ;; "/method:user@", "/user@" or "/[method/user@" as existent, if
+  ;; "user@" is a valid file name completion.  Host completion is
+  ;; performed in the respective backen operation.
   (or (and (cond
             ;; Completion styles like `flex' and `substring' check for
             ;; the file name "/".  This does exist.
@@ -2989,27 +2990,30 @@ not in completion mode."
                    (regexp tramp-prefix-regexp)
                    (* (regexp tramp-remote-file-name-spec-regexp)
                       (regexp tramp-postfix-hop-regexp))
-                   (group (regexp tramp-method-regexp))
+                   (group-n 9 (regexp tramp-method-regexp))
                    (? (regexp tramp-postfix-method-regexp))
                     eos)
                    filename))
-             (assoc (match-string 1 filename) tramp-methods))
-            ;; Is it a valid user@host?
+             (assoc (match-string 9 filename) tramp-methods))
+            ;; Is it a valid user?
             ((string-match
              (rx
                (regexp tramp-prefix-regexp)
               (* (regexp tramp-remote-file-name-spec-regexp)
                  (regexp tramp-postfix-hop-regexp))
-               (group (regexp tramp-remote-file-name-spec-regexp))
+               (group-n 10
+                (regexp tramp-method-regexp)
+                (regexp tramp-postfix-method-regexp))
+              (group-n 11
+                (regexp tramp-user-regexp)
+                (regexp tramp-postfix-user-regexp))
                eos)
               filename)
-             (member
-              (concat
-               (file-name-nondirectory filename) tramp-postfix-host-format)
-              (file-name-all-completions
-               (file-name-nondirectory filename)
-               (file-name-directory filename)))))
-           t)
+            (member
+             (match-string 11 filename)
+             (file-name-all-completions
+              "" (concat tramp-prefix-format (match-string 10 filename))))))
+          t)
 
       (tramp-run-real-handler #'file-exists-p (list filename))))
 
@@ -3629,6 +3633,25 @@ BODY is the backend specific code."
         (tramp-dissect-file-name ,directory) 'file-missing ,directory)
       nil)))
 
+(defmacro tramp-skeleton-file-exists-p (filename &rest body)
+  "Skeleton for `tramp-*-handle-file-exists-p'.
+BODY is the backend specific code."
+  (declare (indent 1) (debug t))
+  ;; `file-exists-p' is used as predicate in file name completion.
+  `(or (and minibuffer-completing-file-name
+           (file-name-absolute-p ,filename)
+           (tramp-string-empty-or-nil-p
+            (tramp-file-name-localname (tramp-dissect-file-name ,filename))))
+       ;; We don't want to run it when `non-essential' is t, or there
+       ;; is no connection process yet.
+       (when (tramp-connectable-p ,filename)
+        (with-parsed-tramp-file-name (expand-file-name ,filename) nil
+          (with-tramp-file-property v localname "file-exists-p"
+            (if (tramp-file-property-p v localname "file-attributes")
+                (not
+                 (null (tramp-get-file-property v localname "file-attributes")))
+              ,@body))))))
+
 (defmacro tramp-skeleton-file-local-copy (filename &rest body)
   "Skeleton for `tramp-*-handle-file-local-copy'.
 BODY is the backend specific code."
@@ -4066,13 +4089,8 @@ Let-bind it when necessary.")
 
 (defun tramp-handle-file-exists-p (filename)
   "Like `file-exists-p' for Tramp files."
-  ;; `file-exists-p' is used as predicate in file name completion.
-  ;; We don't want to run it when `non-essential' is t, or there is
-  ;; no connection process yet.
-  (when (tramp-connectable-p filename)
-    (with-parsed-tramp-file-name (expand-file-name filename) nil
-      (with-tramp-file-property v localname "file-exists-p"
-       (not (null (file-attributes filename)))))))
+  (tramp-skeleton-file-exists-p filename
+    (not (null (file-attributes filename)))))
 
 (defun tramp-handle-file-in-directory-p (filename directory)
   "Like `file-in-directory-p' for Tramp files."