[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: File System Traversal Map/Collect
From: |
Drew Adams |
Subject: |
RE: File System Traversal Map/Collect |
Date: |
Sun, 1 Jun 2008 11:57:01 -0700 |
> 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