bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#63648: 29.0.90; project.el: with switch-use-entire-map, switch-proje


From: Dmitry Gutov
Subject: bug#63648: 29.0.90; project.el: with switch-use-entire-map, switch-project errors on non-project commands
Date: Fri, 1 Sep 2023 04:11:40 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0

On 31/08/2023 19:36, Juri Linkov wrote:
- Unfortunately, using default-directory instead of the specialized
    variable which we added lately (project-current-directory-override)
    brings back the bug it was added for: https://debbugs.gnu.org/58784. The
    switch to a different design didn't fix the problem of the temporary
    binding for d-d in the buffer which is current when the command is
    executed. So adding the next-default-directory variable might not be the
    best idea after all. But the advice thingy can set a binding for any
    variable, including the *-override one.
I didn't test yet the cases from bug#58784.  So this might require more
changes.

We tried to make the default-directory binding work with a couple of
different changes - it didn't work out.

The problem is that let-binding overrides the buffer-local value:

Yep.

```
(let ((default-directory "/tmp/"))
   (list default-directory
         (buffer-local-value 'default-directory (current-buffer))))
=> ("/tmp/" "/tmp/")
```

Here is the shortest test case: 'C-x p p C-b' shows buffers
from two projects when using let-binding for default-directory,
because 'project-buffers' relies on

   (buffer-local-value 'default-directory buf)

This could be fixed by adding special-handling of the default-directory
for the current buffer in 'project-buffers'.

What kind of special handling? The "real" buffer-local value is hidden until the "let" exists, the global value is nil, and if the buffer is not a file-visiting one, there is no other file name to test against.

Finally, whatever special handling we invent, would have to be mirrored by all subsequent new commands (built-in and third-party) which look up the value of default-directory. Especially project-related ones. How to popularize that knowledge, would be the next question for whatever solution we invent.

A general question regarding this approach, for me, is: is a "prefix
command" a real command?

It's a real command that prepares some transient values for the next command.
Most existing prefix commands have no problems because they modify global
values.  But 'default-directory' is the first buffer-local variable
used for the next command, therefore it requires special-handling.
Too bad that 'default-directory' is not a function.

I suppose the new code could check against some property or dynamic var to distinguish prefix commands from "terminal" ones.

And would they "swallow" these prepared variable bindings too early?

The scope of the modified variable depends on concrete needs.
For example, set-transient-map restores its old value in pre-command-hook,
but display-buffer-override-next-command does this in post-command-hook.

That can also work - though the odds of getting into an unrecoverable state (such as one I described) would be higher.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]