Первым шагом будет написание функции, которая переформатирует текущий буфер, так же, как вы делаете это вручную. Для этого вам нужно выяснить команды, с которыми связаны различные последовательности клавиш, которые вы вводите. C-h c
может быть использовано для этого, например, набрав C-h c C-x h
, вы узнаете, что команда, с которой он связан, - mark-whole-buffer
Как только вы это сделаете, написать функцию для автоматизации последовательности очень просто:
(defun reformat-buffer ()
"Reformat the current buffer"
(interactive)
(mark-whole-buffer)
(indent-for-tab-command)
(save-buffer))
Вы можете привязать функцию к некоторой последовательности клавиш, но, поскольку я собираюсь использовать эту функцию в другой функции, которая циклически перебирает файлы, я не буду беспокоиться. Я также не включаю сюда (kill-buffer)
(функцию, связанную с C-x k
), так как я буду использовать временный буфер в циклической функции.
Следующий шаг - перебрать все файлы. Вы не предоставляете никакой информации о том, как организованы файлы, поэтому я собираюсь сделать предположение, чтобы записать что-то конкретное: в зависимости от того, как организованы файлы, вам, возможно, придется изменить это.
Я предполагаю, что все файлы находятся в одном каталоге и имеют суффикс .xml
.
Затем мы можем сделать эквивалент ls *.xml
, чтобы заставить работать все файлы:
(defun reformat-files ()
"Loop over all the files with suffix `.xml' in the current directory
and apply the reformat-buffer function to each of them."
(interactive)
(dolist (file (directory-files "." nil "\.xml$")
(with-temp-buffer
(find-file file)
(reformat-buffer))))
Предполагая, что вы находитесь в правильном каталоге (для подтверждения сделайте M-x cd
), вы можете выполнить это с помощью M-x reformat-files
.
Здесь вообще нет обработки ошибок и нет гарантии: убедитесь, что у вас есть копии любых файлов, которые не могут быть легко восстановлены.