Further optimization in Tramp's file name decomposition
* lisp/net/tramp.el (tramp-syntax): Recompute all file name components. Call `custom-set-variables' after loading. (tramp-build-prefix-format, tramp-build-prefix-regexp) (tramp-build-method-regexp) (tramp-build-postfix-method-format) (tramp-build-postfix-method-regexp) (tramp-build-prefix-ipv6-format) (tramp-build-prefix-ipv6-regexp) (tramp-build-postfix-ipv6-format) (tramp-build-postfix-ipv6-regexp) (tramp-build-postfix-host-format) (tramp-build-postfix-host-regexp) (tramp-build-file-name-regexp) (tramp-build-completion-file-name-regexp): New defuns. (tramp-prefix-format, tramp-prefix-regexp) (tramp-method-regexp, tramp-postfix-method-format) (tramp-postfix-method-regexp, tramp-prefix-ipv6-format) (tramp-prefix-ipv6-regexp, tramp-postfix-ipv6-format) (tramp-postfix-ipv6-regexp, tramp-postfix-host-format) (tramp-postfix-host-regexp) (tramp-remote-file-name-spec-regexp) (tramp-file-name-structure, tramp-file-name-regexp) (tramp-completion-file-name-regexp): Convert defuns into defvars. (tramp-prefix-regexp-alist) (tramp-postfix-method-regexp-alist) (tramp-prefix-ipv6-regexp-alist) (tramp-postfix-ipv6-regexp-alist) (tramp-postfix-host-regexp-alist) (tramp-remote-file-name-spec-regexp-alist): Remove. (tramp-build-remote-file-name-spec-regexp) (tramp-build-file-name-structure): Simplify. (tramp-completion-file-name-regexp-alist): New defconst. (tramp-tramp-file-p, tramp-dissect-file-name) (tramp-make-tramp-file-name) (tramp-completion-make-tramp-file-name) (tramp-rfn-eshadow-update-overlay-regexp) (tramp-register-file-name-handlers) (tramp-completion-handle-file-name-all-completions) (tramp-completion-dissect-file-name, tramp-clear-passwd): * lisp/net/tramp-ftp.el (tramp-ftp-file-name-handler): * lisp/net/tramp-sh.el (tramp-sh-handle-vc-registered) (tramp-compute-multi-hops): Use variables but functions for file name components. * test/lisp/net/tramp-tests.el (tramp-test24-file-name-completion): Use variables but functions for file name components.
This commit is contained in:
parent
29963648dd
commit
7004545244
4 changed files with 193 additions and 203 deletions
|
@ -121,10 +121,10 @@ pass to the OPERATION."
|
|||
(or (boundp 'ange-ftp-name-format)
|
||||
(let (file-name-handler-alist) (require 'ange-ftp)))
|
||||
(let ((ange-ftp-name-format
|
||||
(list (nth 0 (tramp-file-name-structure))
|
||||
(nth 3 (tramp-file-name-structure))
|
||||
(nth 2 (tramp-file-name-structure))
|
||||
(nth 4 (tramp-file-name-structure))))
|
||||
(list (nth 0 tramp-file-name-structure)
|
||||
(nth 3 tramp-file-name-structure)
|
||||
(nth 2 tramp-file-name-structure)
|
||||
(nth 4 tramp-file-name-structure)))
|
||||
;; ange-ftp uses `ange-ftp-ftp-name-arg' and `ange-ftp-ftp-name-res'
|
||||
;; for optimization in `ange-ftp-ftp-name'. If Tramp wasn't active,
|
||||
;; there could be incorrect values from previous calls in case the
|
||||
|
|
|
@ -3437,7 +3437,7 @@ the result will be a local, non-Tramp, file name."
|
|||
(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))))
|
||||
`((,tramp-file-name-regexp . tramp-vc-file-name-handler))))
|
||||
|
||||
;; Here we collect only file names, which need an operation.
|
||||
(tramp-with-demoted-errors
|
||||
|
@ -4468,7 +4468,7 @@ Goes through the list `tramp-inline-compress-commands'."
|
|||
(let ((user (tramp-file-name-user item))
|
||||
(host (tramp-file-name-host item))
|
||||
(proxy (concat
|
||||
(tramp-prefix-format) proxy (tramp-postfix-host-format))))
|
||||
tramp-prefix-format proxy tramp-postfix-host-format)))
|
||||
(tramp-message
|
||||
vec 5 "Add proxy (\"%s\" \"%s\" \"%s\")"
|
||||
(and (stringp host) (regexp-quote host))
|
||||
|
|
|
@ -689,11 +689,34 @@ Do not change the value by `setq', it must be changed only by
|
|||
(tramp-cleanup-all-buffers))
|
||||
;; Set the value:
|
||||
(set-default symbol value)
|
||||
;; Reset `tramp-file-name-regexp'.
|
||||
(setq tramp-file-name-regexp (tramp-file-name-regexp))
|
||||
;; Reset the depending variables.
|
||||
(with-no-warnings
|
||||
(setq tramp-prefix-format (tramp-build-prefix-format)
|
||||
tramp-prefix-regexp (tramp-build-prefix-regexp)
|
||||
tramp-method-regexp (tramp-build-method-regexp)
|
||||
tramp-postfix-method-format (tramp-build-postfix-method-format)
|
||||
tramp-postfix-method-regexp (tramp-build-postfix-method-regexp)
|
||||
tramp-prefix-ipv6-format (tramp-build-prefix-ipv6-format)
|
||||
tramp-prefix-ipv6-regexp (tramp-build-prefix-ipv6-regexp)
|
||||
tramp-postfix-ipv6-format (tramp-build-postfix-ipv6-format)
|
||||
tramp-postfix-ipv6-regexp (tramp-build-postfix-ipv6-regexp)
|
||||
tramp-postfix-host-format (tramp-build-postfix-host-format)
|
||||
tramp-postfix-host-regexp (tramp-build-postfix-host-regexp)
|
||||
tramp-remote-file-name-spec-regexp
|
||||
(tramp-build-remote-file-name-spec-regexp)
|
||||
tramp-file-name-structure (tramp-build-file-name-structure)
|
||||
tramp-file-name-regexp (tramp-build-file-name-regexp)
|
||||
tramp-completion-file-name-regexp
|
||||
(tramp-build-completion-file-name-regexp)))
|
||||
;; Rearrange file name handlers.
|
||||
(tramp-register-file-name-handlers)))
|
||||
|
||||
;; Initialize the Tramp syntax variables. We want to override initial
|
||||
;; values of `tramp-file-name-regexp' and
|
||||
;; `tramp-completion-file-name-regexp'.
|
||||
(eval-after-load 'tramp
|
||||
'(custom-set-variables `(tramp-syntax ',(tramp-compat-tramp-syntax))))
|
||||
|
||||
(defun tramp-syntax-values ()
|
||||
"Return possible values of `tramp-syntax', a list"
|
||||
(let ((values (cdr (get 'tramp-syntax 'custom-type))))
|
||||
|
@ -712,22 +735,19 @@ Raise an error if `tramp-syntax' is invalid."
|
|||
(separate . "/["))
|
||||
"Alist mapping Tramp syntax to strings beginning Tramp file names.")
|
||||
|
||||
(defun tramp-prefix-format ()
|
||||
"String matching the very beginning of Tramp file names.
|
||||
Used in `tramp-make-tramp-file-name'."
|
||||
(defun tramp-build-prefix-format ()
|
||||
(tramp-lookup-syntax tramp-prefix-format-alist))
|
||||
|
||||
(defconst tramp-prefix-regexp-alist
|
||||
(mapcar (lambda (x)
|
||||
(cons (car x) (concat "^" (regexp-quote (cdr x)))))
|
||||
tramp-prefix-format-alist)
|
||||
"Alist of regexps matching the beginnings of Tramp file names.
|
||||
Keyed by Tramp syntax. Derived from `tramp-prefix-format-alist'.")
|
||||
(defvar tramp-prefix-format (tramp-build-prefix-format)
|
||||
"String matching the very beginning of Tramp file names.
|
||||
Used in `tramp-make-tramp-file-name'.")
|
||||
|
||||
(defun tramp-prefix-regexp ()
|
||||
(defun tramp-build-prefix-regexp ()
|
||||
(concat "^" (regexp-quote tramp-prefix-format)))
|
||||
|
||||
(defvar tramp-prefix-regexp (tramp-build-prefix-regexp)
|
||||
"Regexp matching the very beginning of Tramp file names.
|
||||
Should always start with \"^\". Derived from `tramp-prefix-format'."
|
||||
(tramp-lookup-syntax tramp-prefix-regexp-alist))
|
||||
Should always start with \"^\". Derived from `tramp-prefix-format'.")
|
||||
|
||||
(defconst tramp-method-regexp-alist
|
||||
'((default . "[a-zA-Z0-9-]+")
|
||||
|
@ -735,34 +755,33 @@ Should always start with \"^\". Derived from `tramp-prefix-format'."
|
|||
(separate . "[a-zA-Z0-9-]*"))
|
||||
"Alist mapping Tramp syntax to regexps matching methods identifiers.")
|
||||
|
||||
(defun tramp-method-regexp ()
|
||||
"Regexp matching methods identifiers.
|
||||
The `ftp' syntax does not support methods."
|
||||
(defun tramp-build-method-regexp ()
|
||||
(tramp-lookup-syntax tramp-method-regexp-alist))
|
||||
|
||||
(defvar tramp-method-regexp (tramp-build-method-regexp)
|
||||
"Regexp matching methods identifiers.
|
||||
The `ftp' syntax does not support methods.")
|
||||
|
||||
(defconst tramp-postfix-method-format-alist
|
||||
'((default . ":")
|
||||
(simplified . "")
|
||||
(separate . "/"))
|
||||
"Alist mapping Tramp syntax to the delimiter after the method.")
|
||||
|
||||
(defun tramp-postfix-method-format ()
|
||||
"String matching delimiter between method and user or host names.
|
||||
The `ftp' syntax does not support methods.
|
||||
Used in `tramp-make-tramp-file-name'."
|
||||
(defun tramp-build-postfix-method-format ()
|
||||
(tramp-lookup-syntax tramp-postfix-method-format-alist))
|
||||
|
||||
(defconst tramp-postfix-method-regexp-alist
|
||||
(mapcar (lambda (x)
|
||||
(cons (car x) (regexp-quote (cdr x))))
|
||||
tramp-postfix-method-format-alist)
|
||||
"Alist mapping Tramp syntax to regexp matching delimiter after method.
|
||||
Derived from `tramp-postfix-method-format-alist'.")
|
||||
(defvar tramp-postfix-method-format (tramp-build-postfix-method-format)
|
||||
"String matching delimiter between method and user or host names.
|
||||
The `ftp' syntax does not support methods.
|
||||
Used in `tramp-make-tramp-file-name'.")
|
||||
|
||||
(defun tramp-postfix-method-regexp ()
|
||||
(defun tramp-build-postfix-method-regexp ()
|
||||
(regexp-quote tramp-postfix-method-format))
|
||||
|
||||
(defvar tramp-postfix-method-regexp (tramp-build-postfix-method-regexp)
|
||||
"Regexp matching delimiter between method and user or host names.
|
||||
Derived from `tramp-postfix-method-format'."
|
||||
(tramp-lookup-syntax tramp-postfix-method-regexp-alist))
|
||||
Derived from `tramp-postfix-method-format'.")
|
||||
|
||||
(defconst tramp-user-regexp "[^/|: \t]+"
|
||||
"Regexp matching user names.")
|
||||
|
@ -772,8 +791,7 @@ Derived from `tramp-postfix-method-format'."
|
|||
"String matching delimiter between user and domain names.")
|
||||
|
||||
;;;###tramp-autoload
|
||||
(defconst tramp-prefix-domain-regexp
|
||||
(regexp-quote tramp-prefix-domain-format)
|
||||
(defconst tramp-prefix-domain-regexp (regexp-quote tramp-prefix-domain-format)
|
||||
"Regexp matching delimiter between user and domain names.
|
||||
Derived from `tramp-prefix-domain-format'.")
|
||||
|
||||
|
@ -790,8 +808,7 @@ Derived from `tramp-prefix-domain-format'.")
|
|||
"String matching delimiter between user and host names.
|
||||
Used in `tramp-make-tramp-file-name'.")
|
||||
|
||||
(defconst tramp-postfix-user-regexp
|
||||
(regexp-quote tramp-postfix-user-format)
|
||||
(defconst tramp-postfix-user-regexp (regexp-quote tramp-postfix-user-format)
|
||||
"Regexp matching delimiter between user and host names.
|
||||
Derived from `tramp-postfix-user-format'.")
|
||||
|
||||
|
@ -804,28 +821,24 @@ Derived from `tramp-postfix-user-format'.")
|
|||
(separate . ""))
|
||||
"Alist mapping Tramp syntax to strings prefixing IPv6 addresses.")
|
||||
|
||||
(defun tramp-prefix-ipv6-format ()
|
||||
"String matching left hand side of IPv6 addresses.
|
||||
Used in `tramp-make-tramp-file-name'."
|
||||
(defun tramp-build-prefix-ipv6-format ()
|
||||
(tramp-lookup-syntax tramp-prefix-ipv6-format-alist))
|
||||
|
||||
(defconst tramp-prefix-ipv6-regexp-alist
|
||||
(mapcar (lambda (x)
|
||||
(cons (car x) (regexp-quote (cdr x))))
|
||||
tramp-prefix-ipv6-format-alist)
|
||||
"Alist mapping Tramp syntax to regexp matching prefix of IPv6 addresses.
|
||||
Derived from `tramp-prefix-ipv6-format-alist'")
|
||||
(defvar tramp-prefix-ipv6-format (tramp-build-prefix-ipv6-format)
|
||||
"String matching left hand side of IPv6 addresses.
|
||||
Used in `tramp-make-tramp-file-name'.")
|
||||
|
||||
(defun tramp-prefix-ipv6-regexp ()
|
||||
(defun tramp-build-prefix-ipv6-regexp ()
|
||||
(regexp-quote tramp-prefix-ipv6-format))
|
||||
|
||||
(defvar tramp-prefix-ipv6-regexp (tramp-build-prefix-ipv6-regexp)
|
||||
"Regexp matching left hand side of IPv6 addresses.
|
||||
Derived from `tramp-prefix-ipv6-format'."
|
||||
(tramp-lookup-syntax tramp-prefix-ipv6-regexp-alist))
|
||||
Derived from `tramp-prefix-ipv6-format'.")
|
||||
|
||||
;; The following regexp is a bit sloppy. But it shall serve our
|
||||
;; purposes. It covers also IPv4 mapped IPv6 addresses, like in
|
||||
;; "::ffff:192.168.0.1".
|
||||
(defconst tramp-ipv6-regexp
|
||||
"\\(?:\\(?:[a-zA-Z0-9]+\\)?:\\)+[a-zA-Z0-9.]+"
|
||||
(defconst tramp-ipv6-regexp "\\(?:\\(?:[a-zA-Z0-9]+\\)?:\\)+[a-zA-Z0-9.]+"
|
||||
"Regexp matching IPv6 addresses.")
|
||||
|
||||
(defconst tramp-postfix-ipv6-format-alist
|
||||
|
@ -834,28 +847,24 @@ Derived from `tramp-prefix-ipv6-format'."
|
|||
(separate . ""))
|
||||
"Alist mapping Tramp syntax to suffix for IPv6 addresses.")
|
||||
|
||||
(defun tramp-postfix-ipv6-format ()
|
||||
(defun tramp-build-postfix-ipv6-format ()
|
||||
(tramp-lookup-syntax tramp-postfix-ipv6-format-alist))
|
||||
|
||||
(defvar tramp-postfix-ipv6-format (tramp-build-postfix-ipv6-format)
|
||||
"String matching right hand side of IPv6 addresses.
|
||||
Used in `tramp-make-tramp-file-name'."
|
||||
(tramp-lookup-syntax tramp-postfix-ipv6-format-alist))
|
||||
Used in `tramp-make-tramp-file-name'.")
|
||||
|
||||
(defconst tramp-postfix-ipv6-regexp-alist
|
||||
(mapcar (lambda (x)
|
||||
(cons (car x) (regexp-quote (cdr x))))
|
||||
tramp-postfix-ipv6-format-alist)
|
||||
"Alist mapping Tramp syntax to regexps matching IPv6 suffixes.
|
||||
Derived from `tramp-postfix-ipv6-format-alist'.")
|
||||
(defun tramp-build-postfix-ipv6-regexp ()
|
||||
(regexp-quote tramp-postfix-ipv6-format))
|
||||
|
||||
(defun tramp-postfix-ipv6-regexp ()
|
||||
(defvar tramp-postfix-ipv6-regexp (tramp-build-postfix-ipv6-regexp)
|
||||
"Regexp matching right hand side of IPv6 addresses.
|
||||
Derived from `tramp-postfix-ipv6-format'."
|
||||
(tramp-lookup-syntax tramp-postfix-ipv6-format-alist))
|
||||
Derived from `tramp-postfix-ipv6-format'.")
|
||||
|
||||
(defconst tramp-prefix-port-format "#"
|
||||
"String matching delimiter between host names and port numbers.")
|
||||
|
||||
(defconst tramp-prefix-port-regexp
|
||||
(regexp-quote tramp-prefix-port-format)
|
||||
(defconst tramp-prefix-port-regexp (regexp-quote tramp-prefix-port-format)
|
||||
"Regexp matching delimiter between host names and port numbers.
|
||||
Derived from `tramp-prefix-port-format'.")
|
||||
|
||||
|
@ -871,8 +880,7 @@ Derived from `tramp-prefix-port-format'.")
|
|||
(defconst tramp-postfix-hop-format "|"
|
||||
"String matching delimiter after ad-hoc hop definitions.")
|
||||
|
||||
(defconst tramp-postfix-hop-regexp
|
||||
(regexp-quote tramp-postfix-hop-format)
|
||||
(defconst tramp-postfix-hop-regexp (regexp-quote tramp-postfix-hop-format)
|
||||
"Regexp matching delimiter after ad-hoc hop definitions.
|
||||
Derived from `tramp-postfix-hop-format'.")
|
||||
|
||||
|
@ -882,22 +890,19 @@ Derived from `tramp-postfix-hop-format'.")
|
|||
(separate . "]"))
|
||||
"Alist mapping Tramp syntax to strings between host and local names.")
|
||||
|
||||
(defun tramp-postfix-host-format ()
|
||||
"String matching delimiter between host names and localnames.
|
||||
Used in `tramp-make-tramp-file-name'."
|
||||
(defun tramp-build-postfix-host-format ()
|
||||
(tramp-lookup-syntax tramp-postfix-host-format-alist))
|
||||
|
||||
(defconst tramp-postfix-host-regexp-alist
|
||||
(mapcar (lambda (x)
|
||||
(cons (car x) (regexp-quote (cdr x))))
|
||||
tramp-postfix-host-format-alist)
|
||||
"Alist mapping Tramp syntax to regexp matching name delimiters.
|
||||
Derived from `tramp-postfix-host-format-alist'.")
|
||||
(defvar tramp-postfix-host-format (tramp-build-postfix-host-format)
|
||||
"String matching delimiter between host names and localnames.
|
||||
Used in `tramp-make-tramp-file-name'.")
|
||||
|
||||
(defun tramp-postfix-host-regexp ()
|
||||
(defun tramp-build-postfix-host-regexp ()
|
||||
(regexp-quote tramp-postfix-host-format))
|
||||
|
||||
(defvar tramp-postfix-host-regexp (tramp-build-postfix-host-regexp)
|
||||
"Regexp matching delimiter between host names and localnames.
|
||||
Derived from `tramp-postfix-host-format'."
|
||||
(tramp-lookup-syntax tramp-postfix-host-regexp-alist))
|
||||
Derived from `tramp-postfix-host-format'.")
|
||||
|
||||
(defconst tramp-localname-regexp ".*$"
|
||||
"Regexp matching localnames.")
|
||||
|
@ -910,48 +915,35 @@ Derived from `tramp-postfix-host-format'."
|
|||
|
||||
;;; File name format:
|
||||
|
||||
(defun tramp-build-remote-file-name-spec-regexp (syntax)
|
||||
"Construct a regexp matching a Tramp file name for a Tramp SYNTAX."
|
||||
(let ((tramp-syntax syntax))
|
||||
(concat
|
||||
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
|
||||
"\\(?:" "\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp "\\)?"
|
||||
"\\(" "\\(?:" tramp-host-regexp "\\|"
|
||||
(tramp-prefix-ipv6-regexp)
|
||||
"\\(?:" tramp-ipv6-regexp "\\)?"
|
||||
(tramp-postfix-ipv6-regexp) "\\)?"
|
||||
"\\(?:" tramp-prefix-port-regexp tramp-port-regexp "\\)?" "\\)?")))
|
||||
(defun tramp-build-remote-file-name-spec-regexp ()
|
||||
"Construct a regexp matching a Tramp file name for a Tramp syntax.
|
||||
It is expected, that `tramp-syntax' has the proper value."
|
||||
(concat
|
||||
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
|
||||
"\\(?:" "\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp "\\)?"
|
||||
"\\(" "\\(?:" tramp-host-regexp "\\|"
|
||||
tramp-prefix-ipv6-regexp "\\(?:" tramp-ipv6-regexp "\\)?"
|
||||
tramp-postfix-ipv6-regexp "\\)"
|
||||
"\\(?:" tramp-prefix-port-regexp tramp-port-regexp "\\)?" "\\)?"))
|
||||
|
||||
(defconst tramp-remote-file-name-spec-regexp-alist
|
||||
`((default . ,(tramp-build-remote-file-name-spec-regexp 'default))
|
||||
(simplified . ,(tramp-build-remote-file-name-spec-regexp 'simplified))
|
||||
(separate . ,(tramp-build-remote-file-name-spec-regexp 'separate)))
|
||||
"Alist mapping Tramp syntax to regexps matching Tramp file names.")
|
||||
(defvar tramp-remote-file-name-spec-regexp
|
||||
(tramp-build-remote-file-name-spec-regexp)
|
||||
"Regular expression matching a Tramp file name between prefix and postfix.")
|
||||
|
||||
(defun tramp-remote-file-name-spec-regexp ()
|
||||
"Regular expression matching a Tramp file name between prefix and postfix."
|
||||
(tramp-lookup-syntax tramp-remote-file-name-spec-regexp-alist))
|
||||
|
||||
(defun tramp-build-file-name-structure (syntax)
|
||||
"Construct the Tramp file name structure for SYNTAX.
|
||||
(defun tramp-build-file-name-structure ()
|
||||
"Construct the Tramp file name structure for a Tramp syntax.
|
||||
It is expected, that `tramp-syntax' has the proper value.
|
||||
See `tramp-file-name-structure'."
|
||||
(let ((tramp-syntax syntax))
|
||||
(list
|
||||
(concat
|
||||
(tramp-prefix-regexp)
|
||||
"\\(" "\\(?:" (tramp-remote-file-name-spec-regexp)
|
||||
tramp-postfix-hop-regexp "\\)+" "\\)?"
|
||||
(tramp-remote-file-name-spec-regexp) (tramp-postfix-host-regexp)
|
||||
"\\(" tramp-localname-regexp "\\)")
|
||||
5 6 7 8 1)))
|
||||
(list
|
||||
(concat
|
||||
tramp-prefix-regexp
|
||||
"\\(" "\\(?:" tramp-remote-file-name-spec-regexp
|
||||
tramp-postfix-hop-regexp "\\)+" "\\)?"
|
||||
tramp-remote-file-name-spec-regexp tramp-postfix-host-regexp
|
||||
"\\(" tramp-localname-regexp "\\)")
|
||||
5 6 7 8 1))
|
||||
|
||||
(defconst tramp-file-name-structure-alist
|
||||
`((default . ,(tramp-build-file-name-structure 'default))
|
||||
(simplified . ,(tramp-build-file-name-structure 'simplified))
|
||||
(separate . ,(tramp-build-file-name-structure 'separate)))
|
||||
"Alist mapping Tramp syntax to the file name structure for that syntax.")
|
||||
|
||||
(defun tramp-file-name-structure ()
|
||||
(defvar tramp-file-name-structure (tramp-build-file-name-structure)
|
||||
"List of six elements (REGEXP METHOD USER HOST FILE HOP), detailing \
|
||||
the Tramp file name structure.
|
||||
|
||||
|
@ -969,25 +961,22 @@ cascade of several hops.
|
|||
These numbers are passed directly to `match-string', which see. That
|
||||
means the opening parentheses are counted to identify the pair.
|
||||
|
||||
See also `tramp-file-name-regexp'."
|
||||
(tramp-lookup-syntax tramp-file-name-structure-alist))
|
||||
See also `tramp-file-name-regexp'.")
|
||||
|
||||
(defun tramp-file-name-regexp ()
|
||||
"Regular expression matching file names handled by Tramp.
|
||||
This regexp should match Tramp file names but no other file names."
|
||||
(car (tramp-file-name-structure)))
|
||||
(defun tramp-build-file-name-regexp ()
|
||||
(car tramp-file-name-structure))
|
||||
|
||||
;;;###autoload
|
||||
(defconst tramp-initial-file-name-regexp "\\`/.+:.*:"
|
||||
"Value for `tramp-file-name-regexp' for autoload.
|
||||
It must match the initial `tramp-syntax' settings.")
|
||||
|
||||
;; External packages use constant `tramp-file-name-regexp'. In order
|
||||
;; not to break them, we still provide it. It is a variable now.
|
||||
;;;###autoload
|
||||
(defvar tramp-file-name-regexp tramp-initial-file-name-regexp
|
||||
"Value for `tramp-file-name-regexp' for autoload.
|
||||
It must match the initial `tramp-syntax' settings.")
|
||||
"Regular expression matching file names handled by Tramp.
|
||||
This regexp should match Tramp file names but no other file
|
||||
names. When calling `tramp-register-file-name-handlers', the
|
||||
initial value is overwritten by the car of `tramp-file-name-structure'.")
|
||||
|
||||
;;;###autoload
|
||||
(defconst tramp-completion-file-name-regexp-default
|
||||
|
@ -1031,7 +1020,17 @@ On W32 systems, the volume letter must be ignored.")
|
|||
"Value for `tramp-completion-file-name-regexp' for separate remoting.
|
||||
See `tramp-file-name-structure' for more explanations.")
|
||||
|
||||
(defun tramp-completion-file-name-regexp ()
|
||||
(defconst tramp-completion-file-name-regexp-alist
|
||||
`((default . ,tramp-completion-file-name-regexp-default)
|
||||
(simplified . ,tramp-completion-file-name-regexp-simplified)
|
||||
(separate . ,tramp-completion-file-name-regexp-separate))
|
||||
"Alist mapping incomplete Tramp file names.")
|
||||
|
||||
(defun tramp-build-completion-file-name-regexp ()
|
||||
(tramp-lookup-syntax tramp-completion-file-name-regexp-alist))
|
||||
|
||||
(defvar tramp-completion-file-name-regexp
|
||||
(tramp-build-completion-file-name-regexp)
|
||||
"Regular expression matching file names handled by Tramp completion.
|
||||
This regexp should match partial Tramp file names only.
|
||||
|
||||
|
@ -1040,14 +1039,7 @@ this file \(tramp.el) is loaded. This means that this variable must be set
|
|||
before loading tramp.el. Alternatively, `file-name-handler-alist' can be
|
||||
updated after changing this variable.
|
||||
|
||||
Also see `tramp-file-name-structure'."
|
||||
(cond ((eq (tramp-compat-tramp-syntax) 'default)
|
||||
tramp-completion-file-name-regexp-default)
|
||||
((eq (tramp-compat-tramp-syntax) 'simplified)
|
||||
tramp-completion-file-name-regexp-simplified)
|
||||
((eq (tramp-compat-tramp-syntax) 'separate)
|
||||
tramp-completion-file-name-regexp-separate)
|
||||
(t (error "Wrong `tramp-syntax' %s" tramp-syntax))))
|
||||
Also see `tramp-file-name-structure'.")
|
||||
|
||||
;;;###autoload
|
||||
(defconst tramp-initial-completion-file-name-regexp
|
||||
|
@ -1284,7 +1276,7 @@ entry does not exist, return nil."
|
|||
(if (memq system-type '(cygwin windows-nt))
|
||||
"^/[[:alpha:]]?:" "^/:")
|
||||
name))
|
||||
(string-match (tramp-file-name-regexp) name))))
|
||||
(string-match tramp-file-name-regexp name))))
|
||||
|
||||
(defun tramp-find-method (method user host)
|
||||
"Return the right method string to use.
|
||||
|
@ -1356,13 +1348,13 @@ values."
|
|||
(save-match-data
|
||||
(unless (tramp-tramp-file-p name)
|
||||
(tramp-compat-user-error nil "Not a Tramp file name: \"%s\"" name))
|
||||
(if (not (string-match (nth 0 (tramp-file-name-structure)) name))
|
||||
(if (not (string-match (nth 0 tramp-file-name-structure) name))
|
||||
(error "`tramp-file-name-structure' didn't match!")
|
||||
(let ((method (match-string (nth 1 (tramp-file-name-structure)) name))
|
||||
(user (match-string (nth 2 (tramp-file-name-structure)) name))
|
||||
(host (match-string (nth 3 (tramp-file-name-structure)) name))
|
||||
(localname (match-string (nth 4 (tramp-file-name-structure)) name))
|
||||
(hop (match-string (nth 5 (tramp-file-name-structure)) name))
|
||||
(let ((method (match-string (nth 1 tramp-file-name-structure) name))
|
||||
(user (match-string (nth 2 tramp-file-name-structure) name))
|
||||
(host (match-string (nth 3 tramp-file-name-structure) name))
|
||||
(localname (match-string (nth 4 tramp-file-name-structure) name))
|
||||
(hop (match-string (nth 5 tramp-file-name-structure) name))
|
||||
domain port)
|
||||
(when user
|
||||
(when (string-match tramp-user-with-domain-regexp user)
|
||||
|
@ -1373,9 +1365,9 @@ values."
|
|||
(when (string-match tramp-host-with-port-regexp host)
|
||||
(setq port (match-string 2 host)
|
||||
host (match-string 1 host)))
|
||||
(when (string-match (tramp-prefix-ipv6-regexp) host)
|
||||
(when (string-match tramp-prefix-ipv6-regexp host)
|
||||
(setq host (replace-match "" nil t host)))
|
||||
(when (string-match (tramp-postfix-ipv6-regexp) host)
|
||||
(when (string-match tramp-postfix-ipv6-regexp host)
|
||||
(setq host (replace-match "" nil t host))))
|
||||
|
||||
(unless nodefault
|
||||
|
@ -1400,42 +1392,41 @@ values."
|
|||
(method user domain host port localname &optional hop)
|
||||
"Constructs a Tramp file name from METHOD, USER, HOST and LOCALNAME.
|
||||
When not nil, optional DOMAIN, PORT and HOP are used."
|
||||
(concat (tramp-prefix-format) hop
|
||||
(concat tramp-prefix-format hop
|
||||
(unless (or (zerop (length method))
|
||||
(zerop (length (tramp-postfix-method-format))))
|
||||
(concat method (tramp-postfix-method-format)))
|
||||
(zerop (length tramp-postfix-method-format)))
|
||||
(concat method tramp-postfix-method-format))
|
||||
user
|
||||
(unless (zerop (length domain))
|
||||
(concat tramp-prefix-domain-format domain))
|
||||
(unless (zerop (length user))
|
||||
tramp-postfix-user-format)
|
||||
tramp-postfix-user-format)
|
||||
(when host
|
||||
(if (string-match tramp-ipv6-regexp host)
|
||||
(concat
|
||||
(tramp-prefix-ipv6-format) host (tramp-postfix-ipv6-format))
|
||||
(concat tramp-prefix-ipv6-format host tramp-postfix-ipv6-format)
|
||||
host))
|
||||
(unless (zerop (length port))
|
||||
(concat tramp-prefix-port-format port))
|
||||
(tramp-postfix-host-format)
|
||||
tramp-postfix-host-format
|
||||
(when localname localname)))
|
||||
|
||||
(defun tramp-completion-make-tramp-file-name (method user host localname)
|
||||
"Constructs a Tramp file name from METHOD, USER, HOST and LOCALNAME.
|
||||
It must not be a complete Tramp file name, but as long as there are
|
||||
necessary only. This function will be used in file name completion."
|
||||
(concat (tramp-prefix-format)
|
||||
(concat tramp-prefix-format
|
||||
(unless (or (zerop (length method))
|
||||
(zerop (length (tramp-postfix-method-format))))
|
||||
(concat method (tramp-postfix-method-format)))
|
||||
(zerop (length tramp-postfix-method-format)))
|
||||
(concat method tramp-postfix-method-format))
|
||||
(unless (zerop (length user))
|
||||
(concat user tramp-postfix-user-format))
|
||||
(unless (zerop (length host))
|
||||
(concat
|
||||
(if (string-match tramp-ipv6-regexp host)
|
||||
(concat
|
||||
(tramp-prefix-ipv6-format) host (tramp-postfix-ipv6-format))
|
||||
tramp-prefix-ipv6-format host tramp-postfix-ipv6-format)
|
||||
host)
|
||||
(tramp-postfix-host-format)))
|
||||
tramp-postfix-host-format))
|
||||
(when localname localname)))
|
||||
|
||||
(defun tramp-get-buffer (vec)
|
||||
|
@ -1947,7 +1938,7 @@ special handling of `substitute-in-file-name'."
|
|||
'tramp-rfn-eshadow-setup-minibuffer)))
|
||||
|
||||
(defun tramp-rfn-eshadow-update-overlay-regexp ()
|
||||
(format "[^%s/~]*\\(/\\|~\\)" (tramp-postfix-host-format)))
|
||||
(format "[^%s/~]*\\(/\\|~\\)" tramp-postfix-host-format))
|
||||
|
||||
(defun tramp-rfn-eshadow-update-overlay ()
|
||||
"Update `rfn-eshadow-overlay' to cover shadowed part of minibuffer input.
|
||||
|
@ -2365,11 +2356,11 @@ remote file names."
|
|||
;; property of `tramp-file-name-handler', this shall be done by the
|
||||
;; respective foreign handlers.
|
||||
(add-to-list 'file-name-handler-alist
|
||||
(cons (tramp-file-name-regexp) 'tramp-file-name-handler))
|
||||
(cons tramp-file-name-regexp 'tramp-file-name-handler))
|
||||
(put 'tramp-file-name-handler 'safe-magic t)
|
||||
|
||||
(add-to-list 'file-name-handler-alist
|
||||
(cons (tramp-completion-file-name-regexp)
|
||||
(cons tramp-completion-file-name-regexp
|
||||
'tramp-completion-file-name-handler))
|
||||
(put 'tramp-completion-file-name-handler 'safe-magic t)
|
||||
;; Mark `operations' the handler is responsible for.
|
||||
|
@ -2473,8 +2464,8 @@ not in completion mode."
|
|||
;; Suppress hop from completion.
|
||||
(when (string-match
|
||||
(concat
|
||||
(tramp-prefix-regexp)
|
||||
"\\(" "\\(" (tramp-remote-file-name-spec-regexp)
|
||||
tramp-prefix-regexp
|
||||
"\\(" "\\(" tramp-remote-file-name-spec-regexp
|
||||
tramp-postfix-hop-regexp
|
||||
"\\)+" "\\)")
|
||||
fullname)
|
||||
|
@ -2519,9 +2510,8 @@ not in completion mode."
|
|||
;; Unify list, add hop, remove nil elements.
|
||||
(dolist (elt result)
|
||||
(when elt
|
||||
(string-match (tramp-prefix-regexp) elt)
|
||||
(setq elt
|
||||
(replace-match (concat (tramp-prefix-format) hop) nil nil elt))
|
||||
(string-match tramp-prefix-regexp elt)
|
||||
(setq elt (replace-match (concat tramp-prefix-format hop) nil nil elt))
|
||||
(push
|
||||
(substring elt (length (tramp-drop-volume-letter directory)))
|
||||
result1)))
|
||||
|
@ -2569,58 +2559,58 @@ They are collected by `tramp-completion-dissect-file-name1'."
|
|||
(tramp-completion-ipv6-regexp
|
||||
(format
|
||||
"[^%s]*"
|
||||
(if (zerop (length (tramp-postfix-ipv6-format)))
|
||||
(tramp-postfix-host-format)
|
||||
(tramp-postfix-ipv6-format))))
|
||||
(if (zerop (length tramp-postfix-ipv6-format))
|
||||
tramp-postfix-host-format
|
||||
tramp-postfix-ipv6-format)))
|
||||
;; "/method" "/[method"
|
||||
(tramp-completion-file-name-structure1
|
||||
(list
|
||||
(concat
|
||||
(tramp-prefix-regexp)
|
||||
"\\(" (tramp-method-regexp) x-nil "\\)$")
|
||||
tramp-prefix-regexp
|
||||
"\\(" tramp-method-regexp x-nil "\\)$")
|
||||
1 nil nil nil))
|
||||
;; "/method:user" "/[method/user"
|
||||
(tramp-completion-file-name-structure2
|
||||
(list
|
||||
(concat
|
||||
(tramp-prefix-regexp)
|
||||
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
|
||||
"\\(" tramp-user-regexp x-nil "\\)$")
|
||||
tramp-prefix-regexp
|
||||
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
|
||||
"\\(" tramp-user-regexp x-nil "\\)$")
|
||||
1 2 nil nil))
|
||||
;; "/method:host" "/[method/host"
|
||||
(tramp-completion-file-name-structure3
|
||||
(list
|
||||
(concat
|
||||
(tramp-prefix-regexp)
|
||||
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
|
||||
"\\(" tramp-host-regexp x-nil "\\)$")
|
||||
tramp-prefix-regexp
|
||||
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
|
||||
"\\(" tramp-host-regexp x-nil "\\)$")
|
||||
1 nil 2 nil))
|
||||
;; "/method:[ipv6" "/[method/ipv6"
|
||||
(tramp-completion-file-name-structure4
|
||||
(list
|
||||
(concat
|
||||
(tramp-prefix-regexp)
|
||||
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
|
||||
(tramp-prefix-ipv6-regexp)
|
||||
tramp-prefix-regexp
|
||||
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
|
||||
tramp-prefix-ipv6-regexp
|
||||
"\\(" tramp-completion-ipv6-regexp x-nil "\\)$")
|
||||
1 nil 2 nil))
|
||||
;; "/method:user@host" "/[method/user@host"
|
||||
(tramp-completion-file-name-structure5
|
||||
(list
|
||||
(concat
|
||||
(tramp-prefix-regexp)
|
||||
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
|
||||
"\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp
|
||||
"\\(" tramp-host-regexp x-nil "\\)$")
|
||||
tramp-prefix-regexp
|
||||
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
|
||||
"\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp
|
||||
"\\(" tramp-host-regexp x-nil "\\)$")
|
||||
1 2 3 nil))
|
||||
;; "/method:user@[ipv6" "/[method/user@ipv6"
|
||||
(tramp-completion-file-name-structure6
|
||||
(list
|
||||
(concat
|
||||
(tramp-prefix-regexp)
|
||||
"\\(" (tramp-method-regexp) "\\)" (tramp-postfix-method-regexp)
|
||||
"\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp
|
||||
(tramp-prefix-ipv6-regexp)
|
||||
tramp-prefix-regexp
|
||||
"\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp
|
||||
"\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp
|
||||
tramp-prefix-ipv6-regexp
|
||||
"\\(" tramp-completion-ipv6-regexp x-nil "\\)$")
|
||||
1 2 3 nil)))
|
||||
(delq
|
||||
|
@ -4479,10 +4469,10 @@ Invokes `password-read' if available, `read-passwd' else."
|
|||
(tramp-clear-passwd
|
||||
(tramp-dissect-file-name
|
||||
(concat
|
||||
(tramp-prefix-format)
|
||||
tramp-prefix-format
|
||||
(replace-regexp-in-string
|
||||
(concat tramp-postfix-hop-regexp "$")
|
||||
(tramp-postfix-host-format) hop)))))
|
||||
tramp-postfix-host-format hop)))))
|
||||
(auth-source-forget
|
||||
`(:max 1 ,(and user-domain :user) ,user-domain
|
||||
:host ,host-port :port ,method))
|
||||
|
|
|
@ -2852,16 +2852,16 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
|
|||
(tramp-change-syntax syntax)
|
||||
(let ;; This is needed for the `simplified' syntax.
|
||||
((method-marker
|
||||
(if (zerop (length (tramp-method-regexp)))
|
||||
(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)))
|
||||
;; Complete method name.
|
||||
(unless (or (zerop (length method))
|
||||
(zerop (length (tramp-method-regexp))))
|
||||
(zerop (length tramp-method-regexp)))
|
||||
(should
|
||||
(member
|
||||
(concat prefix-format method (tramp-postfix-method-format))
|
||||
(concat prefix-format method tramp-postfix-method-format)
|
||||
(file-name-all-completions
|
||||
(concat prefix-format (substring method 0 1)) "/"))))
|
||||
;; Complete host name for default method. With gvfs
|
||||
|
@ -2873,25 +2873,25 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
|
|||
(should
|
||||
(member
|
||||
(concat
|
||||
prefix-format method-marker (tramp-postfix-method-format)
|
||||
host (tramp-postfix-host-format))
|
||||
prefix-format method-marker tramp-postfix-method-format
|
||||
host tramp-postfix-host-format)
|
||||
(file-name-all-completions
|
||||
(concat
|
||||
prefix-format method-marker (tramp-postfix-method-format)
|
||||
prefix-format method-marker tramp-postfix-method-format
|
||||
(substring host 0 1))
|
||||
"/")))))
|
||||
;; Complete host name.
|
||||
(unless (or (zerop (length method))
|
||||
(zerop (length (tramp-method-regexp)))
|
||||
(zerop (length tramp-method-regexp))
|
||||
(zerop (length host))
|
||||
(tramp--test-gvfs-p method))
|
||||
(should
|
||||
(member
|
||||
(concat
|
||||
prefix-format method (tramp-postfix-method-format)
|
||||
host (tramp-postfix-host-format))
|
||||
prefix-format method tramp-postfix-method-format
|
||||
host tramp-postfix-host-format)
|
||||
(file-name-all-completions
|
||||
(concat prefix-format method (tramp-postfix-method-format))
|
||||
(concat prefix-format method tramp-postfix-method-format)
|
||||
"/"))))))
|
||||
|
||||
;; Cleanup.
|
||||
|
|
Loading…
Add table
Reference in a new issue