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.
This commit is contained in:
Michael Albinus 2023-02-18 18:27:56 +01:00
parent b3502b9228
commit 2ac8d7e64a
4 changed files with 51 additions and 54 deletions

View 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."

View 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."

View 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."

View 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."