Subject: bug#66903: 29.1; shell-mode directory tracking incorrectly handles double slashes

From: Allen Li <[email-masked]>
Date: Fri, 3 Nov 2023 13:54:09 -0700

On Fri, Nov 3, 2023 at 5:07 AM Eli Zaretskii <[email-masked]> wrote:

> > From: Allen Li <[email-masked]>
> > Date: Fri, 3 Nov 2023 03:43:35 -0700
> > Cc: [email-masked]
> >
> > Currently, `cd ~//bin` will cause the shell (Bash or similar) to change
> to ~/bin, and Emacs/shell-mode
> > will change `default-directory` to `/bin`.
> >
> > This bug is saying that Emacs/shell-mode should change
> `default-directory` to `~/bin` by default,
>
> I think it should change default-directory to the directory to which
> the shell switches, not necessarily ~/bin.
>

That sounds different from what you're implying in your other emails.
Using sentences here is confusing.

The current behavior is:

Case 1
input: ~//bin
shell: ~/bin
default-directory: /bin

I'm suggesting

Case 2
input: ~//bin
shell: ~/bin
default-directory: ~/bin

When you say "I think it should change default-directory to the directory
to which
the shell switches, not necessarily ~/bin.", that implies to me Case 2

But your other emails suggest that you want:

Case 3
input: ~//bin (Emacs rewrites to /bin before sending to shell)
shell: /bin
default-directory: /bin

Assuming that you want Case 3, I think that is horrible for multiple
reasons.  Firstly, a user would expect their shell to behave as in Case 2;
Case 3 is a surprising and semantically different rewrite of user input.
Furthermore, we would either have to rewrite all paths not just paths to
`cd`, which would be infeasible and error-prone, or surprise the user again
that Emacs is rewriting paths to `cd` specifically, but not, say, `rm` or
`mv` or many other commands (e.g., `mv ~//bin ~//lib`).  Furthermore, the
only shell input rewriting that Emacs currently does is for history
substitutions, and the syntax for this is identical to common shells;
therefore, users can expect that Emacs does not do any surprising semantic
rewrites of their shell input.  Case 3 would be violating this expectation.

For completeness, there is also

Case 4
input: ~//bin
shell: /bin (normal shell behavior)
default-directory: /bin

However, I am aware of zero shells in common use that behave like Case 4.
Even if we consider it, it should not be the default.

Also for completeness, there is a nuclear solution option, which is to
replace all of the cd, pushd, popd logic that shell-mode currently
implements and always run M-x dirs after every cd, pushd, popd command.
This naturally results in the behavior of Case 2, but also supports Case 4
for hypothetical shells that have said behavior.