unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Lisp code to expand /~ and // but not env vars?
@ 2005-10-02 22:51 Drew Adams
  2005-10-02 23:16 ` Lennart Borgman
  2005-10-03 21:07 ` Drew Adams
  0 siblings, 2 replies; 8+ messages in thread
From: Drew Adams @ 2005-10-02 22:51 UTC (permalink / raw)


I'm looking for Lisp code that will expand /~ and // in a file name, just as
`substitute-in-file-name' does, but without substituting environment
variables.  I want to rationalize a user-input file name, which might
contain /~ and //, but I only want to expand env vars (recursively) in a
separate, later step (e.g. with `substitute-in-file-name').

Can anyone suggest a way to do this /~ and // conversion in Lisp?

Context: On Windows, `substitute-in-file-name' also changes \ to /, and
that's fine, inside env vars, but I don't want this to be done at the top
user-input level. Instead, I want to treat the user input as a regexp (with
normal regexp interpretation of backslash), and only afterward use
`substitute-in-file-name' to recursively expand the env vars. IOW, I don't
want to change \ to / at the top level; I just want to expand /~ and // at
the top level (and not \~ and \\, even on Windows).

It looks like the only existing code to do the /~ and // conversion is C
code (C function `search_embedded_absfilename') that is embedded as part of
the definition of `substitute-in-file-name'. I'm looking for a way to do
(only) that in Lisp.  Thanks.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lisp code to expand /~ and // but not env vars?
  2005-10-02 22:51 Lisp code to expand /~ and // but not env vars? Drew Adams
@ 2005-10-02 23:16 ` Lennart Borgman
  2005-10-03  0:03   ` Drew Adams
  2005-10-03 21:07 ` Drew Adams
  1 sibling, 1 reply; 8+ messages in thread
From: Lennart Borgman @ 2005-10-02 23:16 UTC (permalink / raw)
  Cc: Help-Gnu-Emacs

Drew Adams wrote:

>I'm looking for Lisp code that will expand /~ and // in a file name, just as
>
>  
>
Not quite what you are looking for, but maybe you can use 
(expand-file-name "" "~/")?

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: Lisp code to expand /~ and // but not env vars?
  2005-10-02 23:16 ` Lennart Borgman
@ 2005-10-03  0:03   ` Drew Adams
  2005-10-03 10:50     ` Peter Dyballa
       [not found]     ` <mailman.9543.1128345398.20277.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 8+ messages in thread
From: Drew Adams @ 2005-10-03  0:03 UTC (permalink / raw)


    >I'm looking for Lisp code that will expand /~ and // in a file
    name, just as

    Not quite what you are looking for, but maybe you can use
    (expand-file-name "" "~/")?

Thanks Lennart, but no, that's not it. I need to deal with an arbitrary
input file name, and an arbitrary default directory. Function
`expand-file-name' does not replace "//" and "/~" as
`substitute-in-file-name' does.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lisp code to expand /~ and // but not env vars?
  2005-10-03  0:03   ` Drew Adams
@ 2005-10-03 10:50     ` Peter Dyballa
  2005-10-03 16:34       ` Lennart Borgman
       [not found]     ` <mailman.9543.1128345398.20277.help-gnu-emacs@gnu.org>
  1 sibling, 1 reply; 8+ messages in thread
From: Peter Dyballa @ 2005-10-03 10:50 UTC (permalink / raw)
  Cc: Help-Gnu-Emacs


Am 03.10.2005 um 02:03 schrieb Drew Adams:

> Function `expand-file-name' does not replace "//" and "/~" as 
> `substitute-in-file-name' does.
>

// is in UNIX nonsense. The root is / and does not get more root when 
written as '//' -- this only has in ancient (Apollo) Domain OS a 
meaning (Domain OS could create ad-hoc networks and // was the root of 
the individual members in the network). '//' is created as a text in 
mini-buffer when you either try to find a file or try to dired. The 
right means to handle such strings would be to substitute everything 
from the beginning to // with /.

'/~' probably in every OS is nonsense. / is the root; ~ is, when 
followed by a /, my home directory; ~, when followed by a user's login 
name, means that user's home directory. The sequence '/~' happens to 
appear in mini-buffer when you either try to find a file or try to 
dired. The right means to handle such strings would be to substitute 
everything from the beginning to /~ with ~.


The routines in dired or find-file that handle such 'input' handle it 
already right.

--
Greetings

   Pete

There's no sense in being precise when you don't
even know what you're talking about.
         -- John von Neumann

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lisp code to expand /~ and // but not env vars?
       [not found]     ` <mailman.9543.1128345398.20277.help-gnu-emacs@gnu.org>
@ 2005-10-03 14:55       ` Mathias Dahl
  0 siblings, 0 replies; 8+ messages in thread
From: Mathias Dahl @ 2005-10-03 14:55 UTC (permalink / raw)


Peter Dyballa <Peter_Dyballa@Web.DE> writes:

> // is in UNIX nonsense. The root is / and does not get more root when
> written as '//' -- this only has in ancient (Apollo) Domain OS a
> meaning (Domain OS could create ad-hoc networks and // was the root of
> the individual members in the network). '//' is created as a text in
> mini-buffer when you either try to find a file or try to dired. The
> right means to handle such strings would be to substitute everything
> from the beginning to // with /.

//server/share/file is a valid path to a file on Emacs running under
MS Windows.

/Mathias

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lisp code to expand /~ and // but not env vars?
  2005-10-03 10:50     ` Peter Dyballa
@ 2005-10-03 16:34       ` Lennart Borgman
  0 siblings, 0 replies; 8+ messages in thread
From: Lennart Borgman @ 2005-10-03 16:34 UTC (permalink / raw)
  Cc: Help-Gnu-Emacs

Peter Dyballa wrote:

>> Function `expand-file-name' does not replace "//" and "/~" as 
>> `substitute-in-file-name' does.
>>
>
> // is in UNIX nonsense. The root is / and does not get more root when 
> written as '//' -- this only has in ancient (Apollo) Domain OS a 
> meaning (Domain OS could create ad-hoc networks and // was the root of 
> the individual members in the network). '//' is created as a text in 
> mini-buffer when you either try to find a file or try to dired. The 
> right means to handle such strings would be to substitute everything 
> from the beginning to // with /.

Sorry, but no! This is legal in a path like //host/path/path/file.ext on 
MS Windows.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Lisp code to expand /~ and // but not env vars?
       [not found] <mailman.9471.1128294372.20277.help-gnu-emacs@gnu.org>
@ 2005-10-03 20:40 ` Thien-Thi Nguyen
  0 siblings, 0 replies; 8+ messages in thread
From: Thien-Thi Nguyen @ 2005-10-03 20:40 UTC (permalink / raw)


"Drew Adams" <drew.adams@oracle.com> writes:

> Can anyone suggest a way to do this /~ and // conversion in Lisp?

double the dollar signs in the arg to `substitute-in-file-name'.
something like:

given-input => "def/~/abc/$HOME"

(double-dollar-signs given-input) => "def/~/abc/$$HOME"

(substitute-in-file-name 
  (double-dollar-signs given-input)) => "~/abc/$HOME"

you can write `double-dollar-signs' in various ways...

thi

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: Lisp code to expand /~ and // but not env vars?
  2005-10-02 22:51 Lisp code to expand /~ and // but not env vars? Drew Adams
  2005-10-02 23:16 ` Lennart Borgman
@ 2005-10-03 21:07 ` Drew Adams
  1 sibling, 0 replies; 8+ messages in thread
From: Drew Adams @ 2005-10-03 21:07 UTC (permalink / raw)


    I'm looking for Lisp code that will expand /~ and // in a file
    name, just as
    `substitute-in-file-name' does, but without substituting environment
    variables.  I want to rationalize a user-input file name, which might
    contain /~ and //, but I only want to expand env vars (recursively) in a
    separate, later step (e.g. with `substitute-in-file-name').

Thanks to all who replied. My requirements statement wasn't very good, and I
actually figured out a different way to solve my problem.

FWIW, I meant // or /~ anywhere in an Emacs input file-name, not as the only
input. These are treated specially by substitute-in-file-name, to remove
everything up to and including these, and putting the rest into the root
directory or a home directory, respectively.

Anyway, it turned out that I need to do the regexp matching after this kind
of substitution, but also I want backslash to work for regexps, and not be
interpreted as a directory separator (on Windows). Since I need to
regexp-match after substitute-in-file-name substitution, the solution I
chose was just to fool substitute-in-file-name by replacing any backslashes
with another character (C-g), and then putting them back after
substitute-in-file-name is done.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2005-10-03 21:07 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-10-02 22:51 Lisp code to expand /~ and // but not env vars? Drew Adams
2005-10-02 23:16 ` Lennart Borgman
2005-10-03  0:03   ` Drew Adams
2005-10-03 10:50     ` Peter Dyballa
2005-10-03 16:34       ` Lennart Borgman
     [not found]     ` <mailman.9543.1128345398.20277.help-gnu-emacs@gnu.org>
2005-10-03 14:55       ` Mathias Dahl
2005-10-03 21:07 ` Drew Adams
     [not found] <mailman.9471.1128294372.20277.help-gnu-emacs@gnu.org>
2005-10-03 20:40 ` Thien-Thi Nguyen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).