[Top][All Lists]

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

Re: substitute-in-file-name is not distributive

From: Stefan Monnier
Subject: Re: substitute-in-file-name is not distributive
Date: Tue, 30 Oct 2012 14:58:18 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2.50 (gnu/linux)

>> Hmm... that's odd.  Can you give me some details:
>> - tell me exactly which text you typed in the minibuffer.
> I typed "c:\bin\" in the minibuffer and hit tab. After hitting tab, the
> minibuffer contained "c:/usr/bin", with point at the end.
>> - also tell me how the rfn-eshadow highlights the file name at each step.
> Now that you mention it, I do see that the leading "c:" in the
> minibuffer is highlighted.  That explains why we're substituting
> "c:/usr/bin" and not "/usr/bin".

The "c:" is highlighted because (s-i-f-n "c:\\bin") = (s-i-f-n "\\bin").
Now the problem is that when you replace \bin by /usr/bin suddenly that
same rule doesn't apply any more.

Hmm... I think the core of the problem here is that minibuffer
completion is actually only performed on "the current field" which is
usually the whole minibuffer content, but not with rfn-eshadow.
To fix this, we should invert the relationship between
minibuffer-complete and completion-in-region (i.e. minibuffer-complete
should call completion-in-region rather than the other way around).
This would probably be a good change, but we can't do it for 24.3.

You should be able to work around this problem by removing "field
shadow" from file-name-shadow-properties.

>> Right.  BTW I'm not convinced this is the right pattern to use for your
>> file-name-handler.  I think catching "\\[a-zA-Z]:" or something along
>> these lines might be a better choice.
> Not all paths I want to catch are absolute,

Why not?  Which non-absolute file names [we only use "path" for lists
of directories, as in $INFOPATH] would you need/want to rewrite?
Do you just want to replace \ with / in relative file names or is there
more to it?

> Even "absolute" paths can be drive-letter-relative and begin with
> a simple backslash.

Right, that's what triggers the above problem.

>> BTW, does Cygwin allow backslashes in file-names or does it interpret it
>> as a separator, like Windows does?
> Cygwin interprets backslashes as separators.

So Cygin itself treats "\\bin" and "/bin" as equivalent, but your
rewrite rules treat "\\bin" as a Windows file name and rewrite it to

If you limit yourself to:
- rewrite "\\`[a-zA-Z]:" to "/cygdrive/c" (regardless if it is followed
  by backslashes or forwardslashes).
- rewrite \ to / everywhere.
This should cover the main needs without tripping over the above problem.


reply via email to

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