Function: tramp-completion-dissect-file-name

tramp-completion-dissect-file-name is a byte-compiled function defined in tramp.el.gz.

Signature

(tramp-completion-dissect-file-name NAME)

Documentation

Return a list of tramp-file-name structures for NAME.

They are collected by tramp-completion-dissect-file-name1.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp.el.gz
;; I misuse a little bit the `tramp-file-name' structure in order to
;; handle completion possibilities for partial methods / user names /
;; host names.  Return value is a list of `tramp-file-name' structures
;; according to possible completions.  If "localname" is non-nil it
;; means there shouldn't be a completion anymore.

;; Expected results:

;; "/x" "/[x"
;; ["x" nil nil nil]

;; "/x:" "/[x/"         "/x:y" "/[x/y"       "/x:y:" "/[x/y]"
;; ["x" nil "" nil]     ["x" nil "y" nil]    ["x" nil "y" ""]
;; ["x" "" nil nil]     ["x" "y" nil nil]

;; "/x:y@" "/[x/y@"     "/x:y@z" "/[x/y@z"   "/x:y@z:" "/[x/y@z]"
;; ["x" "y" nil nil]    ["x" "y" "z" nil]    ["x" "y" "z" ""]
(defun tramp-completion-dissect-file-name (name)
  "Return a list of `tramp-file-name' structures for NAME.
They are collected by `tramp-completion-dissect-file-name1'."
  ;; We don't need a special handling for "user%domain", because "%"
  ;; is also hit by `tramp-user-regexp'.  "host#port" is normalized
  ;; for IPv6 hosts.
  (let ((internal-name
	 (replace-regexp-in-string
	  (rx (regexp tramp-postfix-ipv6-regexp)
	      (regexp tramp-prefix-port-regexp))
	  tramp-prefix-port-format name))
	;; "/method" "/[method"
	(tramp-completion-file-name-structure1
	 (list
	  (rx
	   (regexp tramp-prefix-regexp)
	   (group (? (regexp tramp-completion-method-regexp))) eol)
	  1 nil nil nil))
	;; "/method:user" "/[method/user"
	(tramp-completion-file-name-structure2
	 (list
	  (rx
	   (regexp tramp-prefix-regexp)
	   (group (regexp tramp-method-regexp))
	   (regexp tramp-postfix-method-regexp)
	   (group (? (regexp tramp-user-regexp))) eol)
	  1 2 nil nil))
	;; "/method:host" "/[method/host"
	(tramp-completion-file-name-structure3
	 (list
	  (rx
	   (regexp tramp-prefix-regexp)
	   (group (regexp tramp-method-regexp))
	   (regexp tramp-postfix-method-regexp)
	   (group (? (regexp tramp-host-regexp))) eol)
	  1 nil 2 nil))
	;; "/method:[ipv6" "/[method/ipv6"
	(tramp-completion-file-name-structure4
	 (list
	  (rx
	   (regexp tramp-prefix-regexp)
	   (group (regexp tramp-method-regexp))
	   (regexp tramp-postfix-method-regexp)
	   (regexp tramp-prefix-ipv6-regexp)
	   (group (? (regexp tramp-ipv6-regexp))) eol)
	  1 nil 2 nil))
	;; "/method:user@host" "/[method/user@host"
	(tramp-completion-file-name-structure5
	 (list
	  (rx
	   (regexp tramp-prefix-regexp)
	   (group (regexp tramp-method-regexp))
	   (regexp tramp-postfix-method-regexp)
	   (group (regexp tramp-user-regexp))
	   (regexp tramp-postfix-user-regexp)
	   (group (? (regexp tramp-host-regexp))) eol)
	  1 2 3 nil))
	;; "/method:user@[ipv6" "/[method/user@ipv6"
	(tramp-completion-file-name-structure6
	 (list
	  (rx
	   (regexp tramp-prefix-regexp)
	   (group (regexp tramp-method-regexp))
	   (regexp tramp-postfix-method-regexp)
	   (group (regexp tramp-user-regexp))
	   (regexp tramp-postfix-user-regexp)
	   (regexp tramp-prefix-ipv6-regexp)
	   (group (? (regexp tramp-ipv6-regexp))) eol)
	  1 2 3 nil))
	;; "/method:host#port" "/[method/host#port"
	(tramp-completion-file-name-structure7
	 (list
	  (rx
	   (regexp tramp-prefix-regexp)
	   (group (regexp tramp-method-regexp))
	   (regexp tramp-postfix-method-regexp)
	   (group (regexp tramp-host-regexp)
		  (regexp tramp-prefix-port-regexp)
		  (? (regexp tramp-port-regexp)))
	   eol)
	  1 nil 2 nil))
	;; "/method:[ipv6]#port" "/[method/ipv6#port"
	(tramp-completion-file-name-structure8
	 (list
	  (rx
	   (regexp tramp-prefix-regexp)
	   (group (regexp tramp-method-regexp))
	   (regexp tramp-postfix-method-regexp)
	   (regexp tramp-prefix-ipv6-regexp)
	   (group (regexp tramp-ipv6-regexp)
		  (regexp tramp-prefix-port-regexp)
		  (? (regexp tramp-port-regexp)))
	   eol)
	  1 nil 2 nil))
	;; "/method:user@host#port" "/[method/user@host#port"
	(tramp-completion-file-name-structure9
	 (list
	  (rx
	   (regexp tramp-prefix-regexp)
	   (group (regexp tramp-method-regexp))
	   (regexp tramp-postfix-method-regexp)
	   (group (regexp tramp-user-regexp))
	   (regexp tramp-postfix-user-regexp)
	   (group (regexp tramp-host-regexp)
		  (regexp tramp-prefix-port-regexp)
		  (? (regexp tramp-port-regexp)))
	   eol)
	  1 2 3 nil))
	;; "/method:user@[ipv6]#port" "/[method/user@ipv6#port"
	(tramp-completion-file-name-structure10
	 (list
	  (rx
	   (regexp tramp-prefix-regexp)
	   (group (regexp tramp-method-regexp))
	   (regexp tramp-postfix-method-regexp)
	   (group (regexp tramp-user-regexp))
	   (regexp tramp-postfix-user-regexp)
	   (regexp tramp-prefix-ipv6-regexp)
	   (group (regexp tramp-ipv6-regexp)
		  (regexp tramp-prefix-port-regexp)
		  (? (regexp tramp-port-regexp)))
	   eol)
	  1 2 3 nil)))
    (tramp-compat-seq-keep
     (lambda (structure)
       (tramp-completion-dissect-file-name1 structure internal-name))
     (list
      tramp-completion-file-name-structure1
      tramp-completion-file-name-structure2
      tramp-completion-file-name-structure3
      tramp-completion-file-name-structure4
      tramp-completion-file-name-structure5
      tramp-completion-file-name-structure6
      tramp-completion-file-name-structure7
      tramp-completion-file-name-structure8
      tramp-completion-file-name-structure9
      tramp-completion-file-name-structure10))))