]> code.delx.au - gnu-emacs/blobdiff - lisp/net/tramp.el
Simplify now that float-time etc. are built-in
[gnu-emacs] / lisp / net / tramp.el
index e101c42a494fd77140c846e821050b010ff3e474..377b529803c420bc119fb3a1b85b05b387e86d23 100644 (file)
@@ -1010,7 +1010,9 @@ means to use always cached values for the directory contents."
 
 ;;;###autoload
 (defconst tramp-completion-file-name-handler-alist
-  '((file-name-all-completions . tramp-completion-handle-file-name-all-completions)
+  '((expand-file-name . tramp-completion-handle-expand-file-name)
+    (file-name-all-completions
+     . tramp-completion-handle-file-name-all-completions)
     (file-name-completion . tramp-completion-handle-file-name-completion))
   "Alist of completion handler functions.
 Used for file names matching `tramp-file-name-regexp'. Operations
@@ -1944,7 +1946,8 @@ ARGS are the arguments OPERATION has been called with."
    ;; Unknown file primitive.
    (t (error "unknown file I/O primitive: %s" operation))))
 
-(defun tramp-find-foreign-file-name-handler (filename)
+(defun tramp-find-foreign-file-name-handler
+    (filename &optional operation completion)
   "Return foreign file name handler if exists."
   (when (tramp-tramp-file-p filename)
     (let ((v (tramp-dissect-file-name filename t))
@@ -1952,11 +1955,17 @@ ARGS are the arguments OPERATION has been called with."
          elt res)
       ;; When we are not fully sure that filename completion is safe,
       ;; we should not return a handler.
-      (when (or (tramp-file-name-method v) (tramp-file-name-user v)
+      (when (or (not completion)
+               (tramp-file-name-method v) (tramp-file-name-user v)
                (and (tramp-file-name-host v)
                     (not (member (tramp-file-name-host v)
                                  (mapcar 'car tramp-methods))))
-               (not (tramp-completion-mode-p)))
+               ;; Some operations are safe by default.
+               (member
+                operation
+                '(file-name-as-directory
+                  file-name-directory
+                  file-name-nondirectory)))
        (while handler
          (setq elt (car handler)
                handler (cdr handler))
@@ -1984,7 +1993,9 @@ Falls back to normal file name handler if no Tramp file name handler exists."
                (tramp-replace-environment-variables
                 (apply 'tramp-file-name-for-operation operation args)))
               (completion (tramp-completion-mode-p))
-              (foreign (tramp-find-foreign-file-name-handler filename))
+              (foreign
+               (tramp-find-foreign-file-name-handler
+                filename operation completion))
               result)
          (with-parsed-tramp-file-name filename nil
            ;; Call the backend function.
@@ -2099,7 +2110,7 @@ Falls back to normal file name handler if no Tramp file name handler exists."
   (let ((fn (assoc operation tramp-completion-file-name-handler-alist)))
     (if (and
         ;; When `tramp-mode' is not enabled, we don't do anything.
-         fn tramp-mode
+         fn tramp-mode (tramp-completion-mode-p)
          ;; For other syntaxes than `sep', the regexp matches many common
          ;; situations where the user doesn't actually want to use Tramp.
          ;; So to avoid autoloading Tramp after typing just "/s", we
@@ -2206,6 +2217,7 @@ Falls back to normal file name handler if no Tramp file name handler exists."
 
 ;;; File name handler functions for completion mode:
 
+;;;###autoload
 (defvar tramp-completion-mode nil
   "If non-nil, external packages signal that they are in file name completion.
 
@@ -2225,8 +2237,8 @@ should never be set globally, the intention is to let-bind it.")
 ;; Tramp file name syntax. Maybe another variable should be introduced
 ;; overwriting this check in such cases. Or we change Tramp file name
 ;; syntax in order to avoid ambiguities.
-;;;###tramp-autoload
-(defun tramp-completion-mode-p ()
+;;;###autoload
+(progn (defun tramp-completion-mode-p ()
   "Check, whether method / user name / host name completion is active."
   (or
    ;; Signal from outside.  `non-essential' has been introduced in Emacs 24.
@@ -2239,7 +2251,7 @@ should never be set globally, the intention is to let-bind it.")
         (equal last-input-event ?\t)
         (and (not (event-modifiers last-input-event))
              (or (equal last-input-event ?\?)
-                 (equal last-input-event ?\ )))))))
+                 (equal last-input-event ?\ ))))))))
 
 (defun tramp-connectable-p (filename)
   "Check, whether it is possible to connect the remote host w/o side-effects.
@@ -2252,6 +2264,23 @@ not in completion mode."
                    (p (tramp-get-connection-process v)))
               (and p (processp p) (memq (process-status p) '(run open))))))))
 
+;;;###autoload
+(defun tramp-completion-handle-expand-file-name
+    (name &optional dir)
+  "Like `expand-file-name' for Tramp files."
+  (if (tramp-completion-mode-p)
+      (progn
+       ;; If DIR is not given, use `default-directory' or "/".
+       (setq dir (or dir default-directory "/"))
+       ;; Unless NAME is absolute, concat DIR and NAME.
+       (unless (file-name-absolute-p name)
+         (setq name (concat (file-name-as-directory dir) name)))
+       ;; Return NAME.
+       name)
+
+    (tramp-completion-run-real-handler
+     'expand-file-name (list name dir))))
+
 ;; 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.
@@ -2808,13 +2837,17 @@ User is always nil."
   ;; `file-name-as-directory' would be sufficient except localname is
   ;; the empty string.
   (let ((v (tramp-dissect-file-name file t)))
-    ;; Run the command on the localname portion only.
+    ;; Run the command on the localname portion only unless we are in
+    ;; completion mode.
     (tramp-make-tramp-file-name
      (tramp-file-name-method v)
      (tramp-file-name-user v)
      (tramp-file-name-host v)
-     (tramp-run-real-handler
-      'file-name-as-directory (list (or (tramp-file-name-localname v) "")))
+     (if (and (tramp-completion-mode-p)
+             (zerop (length (tramp-file-name-localname v))))
+        ""
+       (tramp-run-real-handler
+       'file-name-as-directory (list (or (tramp-file-name-localname v) ""))))
      (tramp-file-name-hop v))))
 
 (defun tramp-handle-file-name-completion
@@ -3764,26 +3797,6 @@ This is used internally by `tramp-file-mode-from-int'."
       (when vec (tramp-message vec 7 "locale %s" (or locale "C")))
       (or locale "C"))))
 
-(defun tramp-get-local-locale (&optional vec)
-  ;; We use key nil for local connection properties.
-  (with-tramp-connection-property nil "locale"
-    (let ((candidates '("en_US.utf8" "C.utf8" "en_US.UTF-8"))
-         locale)
-      (with-temp-buffer
-       (unless (or (memq system-type '(windows-nt))
-                    (not (zerop (tramp-call-process
-                                 nil "locale" nil t nil "-a"))))
-         (while candidates
-           (goto-char (point-min))
-           (if (string-match (format "^%s\r?$" (regexp-quote (car candidates)))
-                             (buffer-string))
-               (setq locale (car candidates)
-                     candidates nil)
-             (setq candidates (cdr candidates))))))
-      ;; Return value.
-      (when vec (tramp-message vec 7 "locale %s" (or locale "C")))
-      (or locale "C"))))
-
 ;;;###tramp-autoload
 (defun tramp-check-cached-permissions (vec access)
   "Check `file-attributes' caches for VEC.
@@ -4111,7 +4124,7 @@ Invokes `password-read' if available, `read-passwd' else."
 (defun tramp-time-diff (t1 t2)
   "Return the difference between the two times, in seconds.
 T1 and T2 are time values (as returned by `current-time' for example)."
-  (float-time (subtract-time t1 t2)))
+  (float-time (time-subtract t1 t2)))
 
 ;; Currently (as of Emacs 20.5), the function `shell-quote-argument'
 ;; does not deal well with newline characters.  Newline is replaced by