1

Is there a way implemented in Emacs to apply a function on a set of files? (Or, if not, do you know of such an extension?)

For example, if you have a project in a directory (say, scripts to compile and run, the source, and an XML database). You want to run this function on all those files, one by one:

(defun indent-buffer ()
  "Indent the whole buffer according to indent-region-function."
  (interactive)
  (indent-region (point-min) (point-max)) )

What complicates the picture at least to some degree, although certainly not impossible, is that Emacs must be in the correct mode to execute such a function sensibly.

The coolest interface would be to use Emacs as a server, and then send the command, and the file list, as arguments.

Second best if it could be done in Dired.

Emanuel Berg
  • 6,763
  • 7
  • 43
  • 65
  • 1
    For sample code that does similar, look at `bytecomp.el` implementing the functions `byte-compile-file` and `byte-recompile-directory` which performs the following "Recompile every `.el' file in DIRECTORY that needs recompilation." – bsd Nov 11 '12 at 12:34

1 Answers1

2

In batch mode, loop over the arguments.

emacs --batch -l cl --eval '
  (dolist (filename command-line-args-left)
    (find-file filename)
    (indent-region (point-min) (point-max))
    (save-buffer)
    (kill-buffer))'

From dired, use the dired-map-over-marks macro from dired.el or the dired-map-over-marks-check function from dired-aux.el.

(dired-map-over-marks-check indent-buffer nil 'indent)
Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175