Subject: Re: bug#9793: 24.0.90; Unwanted tramp connection on eshell completion.

From: Michael Albinus <[email-masked]>
Date: Tue, 25 Oct 2011 12:41:01 +0200

Stefan Monnier <[email-masked]> writes:

> Both use pretty much the same pcomplete code.
>
> I think I finally figured out what is the difference between the two
> cases:  if you set pcomplete-file-ignore and pcomplete-dir-ignore
> in shell-mode like it is set in eshell, the same problem shows up.
>
> So what happens is:
> - in eshell-mode
>   - file-name-all-completions returns '("tic:" "tequila:" "tmp/")
>   - completion-file-name-table then checks the predicate (which combines
>     file-directory-p with regexp matching to avoid CVS and a few other
>     directories).
>   - this calls (file-directory-p "tequila:") in the "/" dir, which
>     triggers Tramp.
> - in shell-mode
>   - file-name-all-completions returns '("tic:" "tequila:" "tmp/")
>   - completion-file-name-table then checks the predicate (file-directory-p)
>   - file-directory-p is *not* called because completion-file-name-table
>     handles it specially (just checks the presence of a terminating "/").

Thanks for the explanation. I start to understand (honestly, all this
programmable completion is out of my understanding).

> I still don't understand why in eshell, tramp-maybe-open-connection is
> called within the following backtrace:
>   tramp-completion-file-name-handler(file-directory-p "/tequila:")
>   file-directory-p("tequila:")
> whereas when I manually call
>   (let ((default-directory "/")) (file-directory-p "tequila:"))
> tramp-maybe-open-connection is called within the following backtrace:
>   tramp-completion-file-name-handler(expand-file-name "tequila:" "/")
>   file-directory-p("tequila:")

Tramp has some code to guess whether it is in completion mode. Check of
`non-essential' is one proof, checking the last keyboard input (being
TAB, or not) is another one.

If Tramp finds out that it is in completion mode, it suppresses some
remote actions, like expand-file-name. Since your code 

(let ((default-directory "/")) (file-directory-p "tequila:"))

does not show an evidence of the completion mode, all remote actions are
performed.

The actions for `file-directory-p' are never been suppressed, that's why
Tramp performs them also when being in completion mode.

>> In eshell, all file names are good for completion, also remote
>> ones. This is valid, because "cd /sudo::" is a valid command in
>> eshell.
>
> In shell-mode completion also understands Tramp file names (yup, that's
> a bug, we should probably default comint-file-name-prefix to "/:/"), so
> that's not the problem.

Better not. There are still needed checks in shell.el, which are applied
to remote files. `comint-file-name-prefix keeps the remote part of those
files.

See for example Bug#6764.

>> But this makes the trouble with the completion predicate
>> `file-directory-p'.
>
> Yup, I think we should somehow make it so Tramp can say
> (file-directory-p "/tequila:") => t
> without trying to connect to tequila (after all, even if we can't
> connect to tequila, this is still a "directory", just one we currently
> can't access).

That was the intention of my patch :-)
Return t in case of remote files.

Inside Tramp it could be behave such a way when it detects it is in
completion mode. That means, when `non-essential' is set to t. Shall I
do it this way?

>         Stefan

Best regards, Michael.