unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: "Drew Adams" <drew.adams@oracle.com>
To: "'harven'" <harven@free.fr>, <help-gnu-emacs@gnu.org>
Subject: RE: File System Traversal Map/Collect
Date: Sun, 1 Jun 2008 11:57:01 -0700	[thread overview]
Message-ID: <003101c8c419$46fe8150$0200a8c0@us.oracle.com> (raw)
In-Reply-To: <b5d1a813-fb82-4d43-a5b2-b35cc3a2d4c8@y21g2000hsf.googlegroups.com>

> On 1 juin, 01:03, Nordlöw <per.nord...@gmail.com> wrote:
> > I am trying to construct a general file system traversal function
> > which operates (map/collect) on each file using a function as
> > argument. Such a function could be query-replace-regexp() 
> > specializing it to the functions found in findr.el.
> 
> M-x find-name-dired
> then the M and Q command in the resulting Dired buffer allows to make
> a query replacement on a bunch of files. The command find-name-dired
> makes use of the unix find command though, so it is perhaps not so
> useful with respect to what you want to achieve.
> 
> There is also an extension called icicles which
> seems to be able to do what you want -- apply
> a function to a bunch of files, without relying on
> some unix find command. Have a look at the wiki.

Hi Per,

Dunno whether you wanted to do this by program or interactively.

The code defining command `icicle-locate-file' shows you how to get all
accessible files under some directory (which could be `/', for all files). You
can then of course map any function over the list.

If you want, you can use `icicle-locate-file' interactively and save the files
as a list (either to a variable or to a file).

If you want to interactively map a function over only some of the files, which
you choose on the fly by matching an input pattern (or by selecting
individually), then you can use command `icicle-map' to do that.

You can do it all interactively, if you want. `icicle-map' expects an alist,
however, whereas when you save the `icicle-locate-file' completion candidates
you get a plain list of file names. So you would do this:

1. `M-x icicle-locate-file' and `C-M-}' to save the completion
   candidates in a variable, say `foo'.
2. M-: (setq foo (mapcar 'list foo)), to convert to an alist.
3. `C-u M-x icicle-map', entering `foo' as the variable.

You can specify a pattern for file names to match in either step 1 or step 3, or
both. As you change your input, the set of matching files is updated
incrementally.

In step 3, you can use Icicles action keys (e.g. `C-mouse-2', `C-RET', to act on
specific file names, or `C-!' to act on all matching file names).

If you wanted to act often on the same general set of files (e.g. files of a
certain type in a certain set of directories), then you would use steps 1 & 2 to
define that set only once, and then retrieve the set using step 3 any time you
want. 

You can save the set persistently, if you like: just use `C-}' instead of
`C-M-}'. The file names used by `icicle-locate-file' are absolute, so there is
no problem retrieving the set later, whatever the context.

When you act on that set (step 3), you can use an on-the-fly pattern (e.g.
regexp) to specify a subset of the files you are interested in. You can then use
`C-!' to act on all of the files in that subset.

Some doc about this -

`icicle-locate-file':
http://www.emacswiki.org/cgi-bin/wiki/Icicles_-_File-Name_Input

Saving completion candidates:
http://www.emacswiki.org/cgi-bin/wiki/Icicles_-_Candidate_Sets

Persistent sets of completion candidates:
http://www.emacswiki.org/cgi-bin/wiki/Icicles_-_Persistent_Completions

`icicle-map':
http://www.emacswiki.org/cgi-bin/wiki/Icicles_-_Complex_Completions







  reply	other threads:[~2008-06-01 18:57 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-31 23:03 File System Traversal Map/Collect Nordlöw
2008-06-01 17:20 ` harven
2008-06-01 18:57   ` Drew Adams [this message]
2008-06-01 19:41   ` Drew Adams

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='003101c8c419$46fe8150$0200a8c0@us.oracle.com' \
    --to=drew.adams@oracle.com \
    --cc=harven@free.fr \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).