Как отформатировать все файлы под каталогом в emacs? - PullRequest
9 голосов
/ 31 марта 2010

В emacs я форматирую файл как: 1) Cx h (или Mx mark-whole-buffer) 2) CM- \ (или Mx indent-region)

Мне нужна помощь, чтобы показать мне, какотформатировать все файлы под каталогом?

Ответы [ 4 ]

10 голосов
/ 31 марта 2010

Вот еще один способ сделать это:

Сначала оцените это определение функции в буфере *scratch*:

(defun indent-marked-files ()
  (interactive)
  (dolist (file (dired-get-marked-files))
    (find-file file)
    (indent-region (point-min) (point-max))
    (save-buffer)
    (kill-buffer nil)))

Затем откройте буфер Dired на верхнем уровне каталога, в котором вы хотите изменить все файлы. Присвойте команде dired числовой префикс, чтобы она запрашивала переключатели для команды ls и добавьте переключатель R (recurse): Cu Cx d R RET your-directory RET .

Далее отметьте все обычные файлы в списке рекурсивных каталогов: сначала * / , чтобы отметить все каталоги, затем * t , чтобы переключить выбор.

Наконец, выполните приведенную выше команду: M-x indent-отмеченные-файлы .

Имейте в виду, что если у вас уже есть какие-либо буферы, посещающие любой из целевых файлов, они будут уничтожены indent-marked-files. Также помните, что ни одно из изменений файла не будет отменено; используйте с осторожностью! Я проверил это в простом случае, и он, кажется, работает, как описано, но я не даю никаких гарантий.

8 голосов
/ 31 марта 2010

Создать макрос для этого. Откройте каталог в dired ( C-x d ), а затем:

  1. Поставьте точку на первом файле.
  2. Нажмите F3 , чтобы начать запись макроса.
  3. Нажмите RET , чтобы открыть файл.
  4. Отформатируйте его с помощью C-x h , C-M - \ .
  5. похороните буфер с M-x bury-buffer. Вы вернетесь в грязный буфер.
  6. Вниз на одну строку.
  7. Нажмите F4 , чтобы остановить запись макроса.

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

1 голос
/ 31 марта 2010

Вы можете попробовать это:

(defun format-all-files (regexp)
  "Format multiple files in one command."
  (interactive "sFind files matching regexp (default all): ")
  (when (string= "" regexp) (setq regexp ""))
  (let ((dir (file-name-directory regexp))
        (nodir (file-name-nondirectory regexp)))
    (when dir (cd dir))
    (when (string= "" nodir) (setq nodir "."))
    (let ((files (directory-files "." t nodir nil t))
          (errors 0))
      (while (not (null files))
        (let ((filename (car files)))
          (if (file-readable-p filename)
              (progn 
                (set-buffer (find-file-noselect filename))
                (mark-whole-buffer)
                (indent-region-or-balanced-expression)
                (save-buffer)
                (kill-buffer (current-buffer)))
            (incf errors))
          (setq files (cdr files))))
      (when (> errors 0)
        (message (format "%d files were unreadable." errors))))))

Но учтите, что для этого необходимо загружать режим файла снова и снова, что может включать подсветку синтаксиса или любую инициализацию, происходящую при загрузке этого типа. Для действительно больших заданий форматирования пакетная программа, такая как indent, которая только отступов будет намного быстрее.

0 голосов
/ 22 марта 2019

Я опаздываю с ответом на этот вопрос, но это все еще первый результат в Google.

Я улучшил ответ @ Sean , чтобы устранить необходимость в сложном взаимодействии Dired.

(defun my/indent-files (directory extension)
    (interactive (list (read-directory-name "Directory: ")
                       (read-string "File extension: ")))
    (dolist (file (directory-files-recursively directory extension))
        (find-file file)
        (indent-region (point-min) (point-max))
        (save-buffer)
        (kill-buffer nil)))

Пример использования: M-x my/indent-files, затем ~/Dropbox, затем .org.

Это запустит indent-region на всех .org файлах, сохраните буфер и убейте его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...