как переформатировать файлы с помощью скрипта emacs - PullRequest
1 голос
/ 03 апреля 2019

У меня есть большое количество файлов XML, сгенерированных из скрипта Python. Отступы не такие, как должно быть, и я открываю файл в Emacs, C-x h, TAB, C-x C-s, C-x k. Есть ли способ написать это? Другими словами, я хочу использовать вкладку emacs, которая делает отступ для всего выделения всех файлов XML в папке.

Я попытался получить правильные отступы с помощью Element.tail в скрипте python, но не смог сделать это правильно.

1 Ответ

2 голосов
/ 03 апреля 2019

Первым шагом будет написание функции, которая переформатирует текущий буфер, так же, как вы делаете это вручную. Для этого вам нужно выяснить команды, с которыми связаны различные последовательности клавиш, которые вы вводите. 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.

Здесь вообще нет обработки ошибок и нет гарантии: убедитесь, что у вас есть копии любых файлов, которые не могут быть легко восстановлены.

...