# HG changeset patch # User Michael Albinus # Date 1129524406 0 # Node ID 5a1bac1c915b744c6e1942c60d2a3d0f1cc8b434 # Parent b4d414f000c1f5918d02caab4ada75a48a133443 * net/tramp.el (tramp-completion-mode): New defvar. Used in `tramp-completion-mode' for checking if we are in completion mode. (tramp-completion-handle-file-name-all-completions): Reorder code in order to complete for file names only in case there are no method/user/host completions. This is necessary for cooperation with ido. Reported by Kim F. Storm . diff -r b4d414f000c1 -r 5a1bac1c915b lisp/ChangeLog --- a/lisp/ChangeLog Mon Oct 17 02:35:03 2005 +0000 +++ b/lisp/ChangeLog Mon Oct 17 04:46:46 2005 +0000 @@ -1,3 +1,12 @@ +2005-10-17 Michael Albinus + + * net/tramp.el (tramp-completion-mode): New defvar. Used in + `tramp-completion-mode' for checking if we are in completion mode. + (tramp-completion-handle-file-name-all-completions): Reorder code + in order to complete for file names only in case there are no + method/user/host completions. This is necessary for cooperation + with ido. Reported by Kim F. Storm . + 2005-10-16 Chong Yidong * longlines.el (longlines-search-forward) diff -r b4d414f000c1 -r 5a1bac1c915b lisp/net/tramp.el --- a/lisp/net/tramp.el Mon Oct 17 02:35:03 2005 +0000 +++ b/lisp/net/tramp.el Mon Oct 17 04:46:46 2005 +0000 @@ -4384,6 +4384,7 @@ (defun tramp-completion-mode (file) "Checks whether method / user name / host name completion is active." (cond + (tramp-completion-mode t) ((not tramp-unified-filenames) t) ((string-match "^/.*:.*:$" file) nil) ((string-match @@ -4434,70 +4435,83 @@ (substring file (length (tramp-completion-handle-file-name-directory file)))) +(defvar tramp-completion-mode nil + "If non-nil, we are in file name completion mode.") + ;; Method, host name and user name completion. ;; `tramp-completion-dissect-file-name' returns a list of ;; tramp-file-name structures. For all of them we return possible completions. (defun tramp-completion-handle-file-name-all-completions (filename directory) "Like `file-name-all-completions' for partial tramp files." - (let* - ((fullname (concat directory filename)) - ;; local files - (result - (if (tramp-completion-mode fullname) - (tramp-run-real-handler - 'file-name-all-completions (list filename directory)) - (tramp-completion-run-real-handler - 'file-name-all-completions (list filename directory)))) - ;; possible completion structures - (v (tramp-completion-dissect-file-name fullname))) - - (while v - (let* ((car (car v)) - (multi-method (tramp-file-name-multi-method car)) - (method (tramp-file-name-method car)) - (user (tramp-file-name-user car)) - (host (tramp-file-name-host car)) - (localname (tramp-file-name-localname car)) - (m (tramp-find-method multi-method method user host)) - (tramp-current-user user) ; see `tramp-parse-passwd' - all-user-hosts) - - (unless (or multi-method ;; Not handled (yet). - localname) ;; Nothing to complete - - (if (or user host) - - ;; Method dependent user / host combinations - (progn - (mapcar - (lambda (x) - (setq all-user-hosts - (append all-user-hosts - (funcall (nth 0 x) (nth 1 x))))) - (tramp-get-completion-function m)) - - (setq result (append result - (mapcar - (lambda (x) - (tramp-get-completion-user-host - method user host (nth 0 x) (nth 1 x))) - (delq nil all-user-hosts))))) - - ;; Possible methods - (setq result - (append result (tramp-get-completion-methods m))))) - - (setq v (delq car v)))) - - ;;; unify list, remove nil elements - (let (result1) - (while result - (let ((car (car result))) - (when car (add-to-list 'result1 car)) - (setq result (delq car result)))) - - result1))) + (unwind-protect + ;; We need to reset `tramp-completion-mode'. + (progn + (setq tramp-completion-mode t) + (let* + ((fullname (concat directory filename)) + ;; possible completion structures + (v (tramp-completion-dissect-file-name fullname)) + result result1) + + (while v + (let* ((car (car v)) + (multi-method (tramp-file-name-multi-method car)) + (method (tramp-file-name-method car)) + (user (tramp-file-name-user car)) + (host (tramp-file-name-host car)) + (localname (tramp-file-name-localname car)) + (m (tramp-find-method multi-method method user host)) + (tramp-current-user user) ; see `tramp-parse-passwd' + all-user-hosts) + + (unless (or multi-method ;; Not handled (yet). + localname) ;; Nothing to complete + + (if (or user host) + + ;; Method dependent user / host combinations + (progn + (mapcar + (lambda (x) + (setq all-user-hosts + (append all-user-hosts + (funcall (nth 0 x) (nth 1 x))))) + (tramp-get-completion-function m)) + + (setq result (append result + (mapcar + (lambda (x) + (tramp-get-completion-user-host + method user host (nth 0 x) (nth 1 x))) + (delq nil all-user-hosts))))) + + ;; Possible methods + (setq result + (append result (tramp-get-completion-methods m))))) + + (setq v (cdr v)))) + + ;; unify list, remove nil elements + (while result + (let ((car (car result))) + (when car (add-to-list 'result1 car)) + (setq result (cdr result)))) + + ;; Complete local parts + (append + result1 + (condition-case nil + (if result1 + ;; "/ssh:" does not need to be expanded as hostname. + (tramp-run-real-handler + 'file-name-all-completions (list filename directory)) + ;; No method/user/host found to be expanded. + (tramp-completion-run-real-handler + 'file-name-all-completions (list filename directory))) + (error nil))))) + ;; unwindform + (setq tramp-completion-mode nil))) ;; Method, host name and user name completion for a file. (defun tramp-completion-handle-file-name-completion (filename directory)