From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.bugs Subject: bug#4260: 23.1.50; tramp is loading unnecessarily Date: Thu, 27 Aug 2009 13:54:33 -0400 Message-ID: References: Reply-To: Stefan Monnier , 4260@emacsbugs.donarmstrong.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit X-Trace: ger.gmane.org 1251396441 9711 80.91.229.12 (27 Aug 2009 18:07:21 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 27 Aug 2009 18:07:21 +0000 (UTC) Cc: "4260@emacsbugs.donarmstrong.com" <4260@emacsbugs.donarmstrong.com>, Peter Dyballa To: Michael Albinus Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Aug 27 20:07:14 2009 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1MgjNO-0005LT-43 for geb-bug-gnu-emacs@m.gmane.org; Thu, 27 Aug 2009 20:07:10 +0200 Original-Received: from localhost ([127.0.0.1]:60894 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MgjNN-0002rh-De for geb-bug-gnu-emacs@m.gmane.org; Thu, 27 Aug 2009 14:07:09 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MgjNH-0002mA-H6 for bug-gnu-emacs@gnu.org; Thu, 27 Aug 2009 14:07:03 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MgjNC-0002Ua-78 for bug-gnu-emacs@gnu.org; Thu, 27 Aug 2009 14:07:02 -0400 Original-Received: from [199.232.76.173] (port=57547 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MgjNC-0002U4-2N for bug-gnu-emacs@gnu.org; Thu, 27 Aug 2009 14:06:58 -0400 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:35026) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1MgjNB-0003T8-C0 for bug-gnu-emacs@gnu.org; Thu, 27 Aug 2009 14:06:57 -0400 Original-Received: from rzlab.ucr.edu (rzlab.ucr.edu [127.0.0.1]) by rzlab.ucr.edu (8.14.3/8.14.3/Debian-5) with ESMTP id n7RI6r0U001776; Thu, 27 Aug 2009 11:06:54 -0700 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.14.3/8.14.3/Submit) id n7RI04N8032269; Thu, 27 Aug 2009 11:00:04 -0700 Resent-Date: Thu, 27 Aug 2009 11:00:04 -0700 X-Loop: owner@emacsbugs.donarmstrong.com Resent-From: Stefan Monnier Resent-To: bug-submit-list@donarmstrong.com Resent-CC: Emacs Bugs 2Resent-Date: Thu, 27 Aug 2009 18:00:04 +0000 Resent-Message-ID: Resent-Sender: owner@emacsbugs.donarmstrong.com X-Emacs-PR-Message: followup 4260 X-Emacs-PR-Package: emacs X-Emacs-PR-Keywords: Original-Received: via spool by 4260-submit@emacsbugs.donarmstrong.com id=B4260.125139567831237 (code B ref 4260); Thu, 27 Aug 2009 18:00:04 +0000 Original-Received: (at 4260) by emacsbugs.donarmstrong.com; 27 Aug 2009 17:54:38 +0000 X-Spam-Bayes: score:0.5 Bayes not run. spammytokens:Tokens not available. hammytokens:Tokens not available. Original-Received: from pruche.dit.umontreal.ca (pruche.dit.umontreal.ca [132.204.246.22]) by rzlab.ucr.edu (8.14.3/8.14.3/Debian-5) with ESMTP id n7RHsYQU031232 for <4260@emacsbugs.donarmstrong.com>; Thu, 27 Aug 2009 10:54:36 -0700 Original-Received: from faina.iro.umontreal.ca (faina.iro.umontreal.ca [132.204.26.177]) by pruche.dit.umontreal.ca (8.14.1/8.14.1) with ESMTP id n7RHsXLb032189; Thu, 27 Aug 2009 13:54:33 -0400 Original-Received: by faina.iro.umontreal.ca (Postfix, from userid 20848) id 4EA6B3A06F; Thu, 27 Aug 2009 13:54:33 -0400 (EDT) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (gnu/linux) X-NAI-Spam-Level: X-NAI-Spam-Score: 0.1 X-NAI-Spam-Rules: 2 Rules triggered PHISH_ACC_002=0.1, RV3350=0 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Resent-Date: Thu, 27 Aug 2009 14:07:02 -0400 X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:30613 Archived-At: >>> Because partial completion is enabled by default in Emacs 23. It wasn't >>> in Emacs 22. >> >> As I said, I think the current behavior is wrong and should be fixed. >> "check if partial-completion is enabled" was a heuristic which worked in >> Emacs-23. It's not The Right Thing. So we shouldn't take it as holy >> word and stick to it. Instead we should revisit it. >> The thing that does matter is that "emacs -Q" should not autoload Tramp when >> you just do C-x C-f /s TAB > That's what I'm working on. Tramp shall not be loaded before you type > "C-x C-f /s: TAB" or "C-x C-f /s@ TAB". > Alternatively, we could introduce another value `remote-completion' (or > something like this) to be added to `completion-styles'. Then a user > must place in her .emacs > (add-to-list 'completion-styles 'remote-completion) > Which solution do you prefer? completion-styles has nothing to do with it, so it would be wrong to abuse it this way: completion-styles is about how to use completion-tables to provide the completion UI, whereas the problem at hand is about whether (and when) the file name completion-table should provide completion of Tramp method/host/user names. As mentioned, one way to go about it is to only provide this completion when Tramp is loaded (e.g. with the sample patch below). Or maybe we can be more clever. Stefan Using submit branch file:///home/monnier/src/emacs/bzr/trunk/ === modified file 'lisp/net/tramp.el' --- lisp/net/tramp.el 2009-08-18 01:11:33 +0000 +++ lisp/net/tramp.el 2009-08-18 15:47:13 +0000 @@ -987,7 +987,9 @@ :type 'regexp) (defcustom tramp-shell-prompt-pattern - "^[^#$%>\n]*[#$%>] *\\(\e\\[[0-9;]*[a-zA-Z] *\\)*" + ;; Allow a prompt to start right after a ^M since it indeed would be + ;; displayed at the beginning of the line (and Zsh uses it). + "\\(?:^\\| \\)[^#$%>\n]*[#$%>] *\\(\e\\[[0-9;]*[a-zA-Z] *\\)*" "Regexp to match prompts from remote shell. Normally, Tramp expects you to configure `shell-prompt-pattern' correctly, but sometimes it happens that you are connecting to a @@ -1369,29 +1371,29 @@ ;;;###autoload (defconst tramp-root-regexp (if (memq system-type '(cygwin windows-nt)) - "^\\([a-zA-Z]:\\)?/" - "^/") + "\\`\\([a-zA-Z]:\\)?/" + "\\`/") "Beginning of an incomplete Tramp file name. -Usually, it is just \"^/\". On W32 systems, there might be a +Usually, it is just \"\\\\`/\". On W32 systems, there might be a volume letter, which will be removed by `tramp-drop-volume-letter'.") ;;;###autoload (defconst tramp-completion-file-name-regexp-unified - (concat tramp-root-regexp "[^/]*$") + (concat tramp-root-regexp "[^/]*\\'") "Value for `tramp-completion-file-name-regexp' for unified remoting. GNU Emacs uses a unified filename syntax for Tramp and Ange-FTP. See `tramp-file-name-structure' for more explanations.") ;;;###autoload (defconst tramp-completion-file-name-regexp-separate - (concat tramp-root-regexp "\\([[][^]]*\\)?$") + (concat tramp-root-regexp "\\([[][^]]*\\)?\\'") "Value for `tramp-completion-file-name-regexp' for separate remoting. XEmacs uses a separate filename syntax for Tramp and EFS. See `tramp-file-name-structure' for more explanations.") ;;;###autoload (defconst tramp-completion-file-name-regexp-url - (concat tramp-root-regexp "[^/:]+\\(:\\(/\\(/[^/]*\\)?\\)?\\)?$") + (concat tramp-root-regexp "[^/:]+\\(:\\(/\\(/[^/]*\\)?\\)?\\)?\\'") "Value for `tramp-completion-file-name-regexp' for URL-like remoting. See `tramp-file-name-structure' for more explanations.") @@ -2454,6 +2456,8 @@ (defun tramp-handle-file-attributes (filename &optional id-format) "Like `file-attributes' for Tramp files." (unless id-format (setq id-format 'integer)) + ;; Don't modify last-coding-system-used by accident. + (let ((last-coding-system-used last-coding-system-used)) (with-parsed-tramp-file-name (expand-file-name filename) nil (with-file-property v localname (format "file-attributes-%s" id-format) (when (file-exists-p filename) @@ -2466,7 +2470,7 @@ (if (tramp-get-remote-perl v) (tramp-handle-file-attributes-with-perl v localname id-format) (tramp-handle-file-attributes-with-ls - v localname id-format))))))))) + v localname id-format)))))))))) (defun tramp-handle-file-attributes-with-ls (vec localname &optional id-format) "Implement `file-attributes' for Tramp files using the ls(1) command." @@ -2719,6 +2723,8 @@ ;; another implementation, see `dired-do-chown'. OTOH, it is mostly ;; working with su(do)? when it is needed, so it shall succeed in ;; the majority of cases. + ;; Don't modify last-coding-system-used by accident. + (let ((last-coding-system-used last-coding-system-used)) (if (file-remote-p filename) (with-parsed-tramp-file-name filename nil (if (and (zerop (user-uid)) (tramp-local-host-p v)) @@ -2739,7 +2745,7 @@ (gid (or (and (integerp gid) gid) (tramp-get-local-gid 'integer)))) (tramp-local-call-process "chown" nil nil nil - (format "%d:%d" uid gid) (tramp-shell-quote-argument filename))))) + (format "%d:%d" uid gid) (tramp-shell-quote-argument filename)))))) ;; Simple functions using the `test' command. @@ -4889,59 +4895,41 @@ ;; would otherwise use backslash. (let ((directory-sep-char ?/) (fn (assoc operation tramp-completion-file-name-handler-alist))) + (if (and ;; When `tramp-mode' is not enabled, we don't do anything. - (if (and fn tramp-mode) + fn tramp-mode + ;; 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 + ;; disable this part of the completion, unless the user implicitly + ;; indicated his interest in using a fancier completion system. + (or (eq tramp-syntax 'sep) + (featurep 'tramp) ;If it's loaded, we may as well use it. + (and (boundp 'partial-completion-mode) partial-completion-mode) + ;; FIXME: These may have been loaded even if the user never + ;; intended to use them. + (featurep 'ido) + (featurep 'icicles))) (save-match-data (apply (cdr fn) args)) (tramp-completion-run-real-handler operation args))))) ;;;###autoload -(defsubst tramp-register-file-name-handler () - "Add Tramp file name handler to `file-name-handler-alist'." - ;; Remove autoloaded handler from file name handler alist. Useful, +(defsubst tramp-register-file-name-handlers () + "Add Tramp file name handlers to `file-name-handler-alist'." + ;; Remove autoloaded handlers from file name handler alist. Useful, ;; if `tramp-syntax' has been changed. (let ((a1 (rassq 'tramp-file-name-handler file-name-handler-alist))) - (setq file-name-handler-alist (delete a1 file-name-handler-alist))) - ;; Add the handler. - (add-to-list 'file-name-handler-alist - (cons tramp-file-name-regexp 'tramp-file-name-handler)) - ;; If jka-compr is already loaded, move it to the front of - ;; `file-name-handler-alist'. - (let ((jka (rassoc 'jka-compr-handler file-name-handler-alist))) - (when jka - (setq file-name-handler-alist - (cons jka (delete jka file-name-handler-alist)))))) - -;; `tramp-file-name-handler' must be registered before evaluation of -;; site-start and init files, because there might exist remote files -;; already, f.e. files kept via recentf-mode. -;;;###autoload(tramp-register-file-name-handler) -(tramp-register-file-name-handler) - -;;;###autoload -(defsubst tramp-register-completion-file-name-handler () - "Add Tramp completion file name handler to `file-name-handler-alist'." - ;; Remove autoloaded handler from file name handler alist. Useful, - ;; if `tramp-syntax' has been changed. + (setq file-name-handler-alist (delq a1 file-name-handler-alist))) (let ((a1 (rassq 'tramp-completion-file-name-handler file-name-handler-alist))) - (setq file-name-handler-alist (delete a1 file-name-handler-alist))) - ;; In XEmacs, there is another Tramp syntax, so we can enable this - ;; unconditionally. In GNU Emacs <= 22, method/user/host name - ;; completion shall be bound to `partial-completion-mode'. Starting - ;; with GNU Emacs 23, this is replaced by `completion-styles', - ;; containing symbol `partial-completion'. `ido-mode' and - ;; `icy-mode' are other packages which extend file name completion. - (when (or (and (boundp 'partial-completion-mode) - (symbol-value 'partial-completion-mode)) - (and (boundp 'completion-styles) - (member 'partial-completion (symbol-value 'completion-styles))) - (featurep 'xemacs) - (featurep 'ido) - (featurep 'icicles)) + (setq file-name-handler-alist (delq a1 file-name-handler-alist))) + ;; Add the handlers. + (add-to-list 'file-name-handler-alist + (cons tramp-file-name-regexp 'tramp-file-name-handler)) (add-to-list 'file-name-handler-alist (cons tramp-completion-file-name-regexp 'tramp-completion-file-name-handler)) - (put 'tramp-completion-file-name-handler 'safe-magic t)) + (put 'tramp-completion-file-name-handler 'safe-magic t) ;; If jka-compr is already loaded, move it to the front of ;; `file-name-handler-alist'. (let ((jka (rassoc 'jka-compr-handler file-name-handler-alist))) @@ -4949,13 +4937,11 @@ (setq file-name-handler-alist (cons jka (delete jka file-name-handler-alist)))))) -;; During autoload, it shall be checked whether -;; `partial-completion-mode' is active. Therefore, registering of -;; `tramp-completion-file-name-handler' will be delayed. -;;;###autoload(add-hook -;;;###autoload 'after-init-hook -;;;###autoload 'tramp-register-completion-file-name-handler) -(tramp-register-completion-file-name-handler) +;; `tramp-file-name-handler' must be registered before evaluation of +;; site-start and init files, because there might exist remote files +;; already, f.e. files kept via recentf-mode. +;;;###autoload(tramp-register-file-name-handlers) +(tramp-register-file-name-handlers) ;;;###autoload (defun tramp-unload-file-name-handlers () @@ -6952,7 +6938,7 @@ (unless (stringp (nth 8 attr)) (setcar (nthcdr 8 attr) (tramp-file-mode-from-int (nth 8 attr))) (when (stringp (car attr)) - (aset (nth 8 attr) 0 ?l))) + (setf (nth 8 attr) (concat "l" (substring (nth 8 attr) 1))))) ;; Convert directory indication bit. (when (string-match "^d" (nth 8 attr)) (setcar attr t)) @@ -7559,7 +7545,7 @@ (file-name-handler-alist (list (cons "/" - '(lambda (operation &rest args) + (lambda (operation &rest args) "Returns OPERATION if it is the one to be checked." (if (equal check-file-name-operation operation) operation