(defconst tramp-completion-file-name-handler-alist
'((expand-file-name . tramp-completion-handle-expand-file-name)
+ (file-directory-p . tramp-completion-handle-file-directory-p)
(file-exists-p . tramp-completion-handle-file-exists-p)
(file-name-all-completions
. tramp-completion-handle-file-name-all-completions)
(concat dir filename))
(t (tramp-run-real-handler #'expand-file-name (list filename directory))))))
+;; This is needed in pcomplete.el.
+(defun tramp-completion-handle-file-directory-p (filename)
+ "Like `file-directory-p' for partial Tramp files."
+ ;; 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.
+ (or (string-equal filename "/")
+ (and ;; Is it a valid method?
+ (not (string-empty-p tramp-postfix-method-format))
+ (string-match
+ (rx
+ (regexp tramp-prefix-regexp)
+ (* (regexp tramp-remote-file-name-spec-regexp)
+ (regexp tramp-postfix-hop-regexp))
+ (group-n 9 (regexp tramp-method-regexp))
+ (? (regexp tramp-postfix-method-regexp))
+ eos)
+ filename)
+ (assoc (match-string 9 filename) tramp-methods)
+ t)
+
+ (tramp-run-real-handler #'file-directory-p (list filename))))
+
(defun tramp-completion-handle-file-exists-p (filename)
"Like `file-exists-p' for partial Tramp files."
;; We need special handling only when a method is needed. Then we
;; "method" is a valid Tramp method. And we regard all files
;; "/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.
+ ;; performed in the respective backend operation.
(or (and (cond
;; Completion styles like `flex' and `substring' check for
;; the file name "/". This does exist.