Subject: bug#50387: Possible bug in Tramp or in completions

From: Gregory Heytings <[email-masked]>
Date: Mon, 06 Sep 2021 20:55:15 +0000

Hi Michael,

>> * lisp/net/tramp.el (tramp-completion-handle-file-name-all-completions):
>> Do not return methods when the filename already contains a complete method.
>> Fixes bug#50387.
>
> I don't see this implemented. You rather don't return methods when the 
> filename does not contain a possible method string at all.
>

Yet this is what is happening.  You can try it yourself: emacs -Q, M-: 
(require 'tramp), M-: (add-to-list 'completion-styles 'substring), C-x C-f 
/scp: TAB.  This will display "Sole completion", and it displays "Sole 
completion" because "scp:" and "scpx:" are added in the completion 
candiates in tramp-completion-handle-file-name-all-completions.  You can 
see this with

(message "method '%s' result '%s'" method (tramp-get-completion-methods m))

around "Possible methods".  With C-x C-f /scp TAB, you will see

method ’scp’ result ’(nil nil nil nil nil nil nil nil nil nil nil nil nil 
nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil /scpx: /scp: 
nil nil nil nil nil)’

which is correct, but with C-x C-f /scp: TAB, you will see

method ’’ result ’(nil nil nil nil nil nil nil nil nil nil nil nil nil nil 
nil nil nil nil nil nil nil nil nil nil nil nil nil nil /scpx: /scp: nil 
nil nil nil nil)’

which is wrong.

>>  	    ;; Possible methods.
>> -	    (setq result
>> -		  (append result (tramp-get-completion-methods m)))))))
>> +	    (unless (or (string-empty-p method)
>> +		        (string-empty-p user)
>> +		        (string-empty-p host))
>
> The check for (string-empty-p user) and (string-empty-p host) wouldn't 
> be needed, you are in the else branch of (or user host). IOW, user and 
> host are already nil, nothing left to test for them.
>

Whoops, yes, indeed.  Updated patch attached.

From 5f4b821bbf5123422d43895bee4c847cfadf31b0 Mon Sep 17 00:00:00 2001
From: Gregory Heytings <[email-masked]>
Date: Mon, 6 Sep 2021 20:52:21 +0000
Subject: [PATCH] Improve handling of non-default completion styles with Tramp
 methods

* lisp/net/tramp.el (tramp-completion-handle-file-name-all-completions):
Do not return methods when the filename already contains a complete method.
Fixes bug#50387.
---
 lisp/net/tramp.el | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 4fd7a322d4..259fc1fcfc 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -2839,8 +2839,9 @@ tramp-completion-handle-file-name-all-completions
 			       (delq nil all-user-hosts)))))
 
 	    ;; Possible methods.
-	    (setq result
-		  (append result (tramp-get-completion-methods m)))))))
+	    (unless (string-empty-p method)
+	      (setq result
+		    (append result (tramp-get-completion-methods m))))))))
 
     ;; Unify list, add hop, remove nil elements.
     (dolist (elt result)
-- 
2.33.0