summaryrefslogtreecommitdiff
path: root/lisp/net/tramp.el
diff options
context:
space:
mode:
authorMichael Albinus <michael.albinus@gmx.de>2023-02-18 18:27:56 +0100
committerMichael Albinus <michael.albinus@gmx.de>2023-02-18 18:27:56 +0100
commit2ac8d7e64a08ea6e22bb90ad16e2880440fbcf16 (patch)
tree707d87bff3751bf849a6fe1b4c777e9523282592 /lisp/net/tramp.el
parentb3502b922821fd100fb86b8cda6a0a62fba7d394 (diff)
downloademacs-2ac8d7e64a08ea6e22bb90ad16e2880440fbcf16.tar.gz
Improve Tramp's user and host name completion
* 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.
Diffstat (limited to 'lisp/net/tramp.el')
-rw-r--r--lisp/net/tramp.el58
1 files changed, 38 insertions, 20 deletions
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 95b42fb1c43..baa9f966dd8 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -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."