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."
  (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.

  • 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

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))

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)
|improve this answer|||||
  • The batch mode code works great, only, I had to remove the -1 option, and that's not in my man emacs, either? – Emanuel Berg Nov 12 '12 at 22:40
  • @EmanuelBerg I have no idea where that -1 crept in from. – Gilles 'SO- stop being evil' Nov 12 '12 at 23:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.