Как применить новый стиль Emacs C для переформатирования всех моих исходных файлов?

Я хочу переформатировать все мои исходные файлы, используя функцию форматирования Google для emacs: google-c-style.el (см. здесь).

Как я могу применить эту функцию ко всем моим исходным файлам сразу, чтобы они все были правильно отформатированы и отступы в соответствии со стилем Google?


person Frank    schedule 04.04.2009    source источник


Ответы (4)


Для этого есть несколько частей:

  • вам нужно придумать функции EMACS, чтобы сделать все переформатирование, которое вы хотите. indent-region — это начало, но вы также можете отменить табуляцию или что-то еще.
  • вам нужно вызывать их для каждого файла, и, поскольку функции отступа работают с диапазонами, вам нужна функция, которая устанавливает метку для покрытия всего файла: mark-whole-buffer.
  • вам нужно вызывать EMACS для каждого файла: это означает вызов emacs с --batch файлом.

Есть несколько хороших сообщений в блоге об этом здесь и здесь.

person Charlie Martin    schedule 04.04.2009
comment
К сожалению, ссылки на сообщения в блоге теперь мертвы. - person Paul; 01.11.2011
comment
Сообщения в блоге снова сломаны. Интернет-архив поймал один перенаправление на другой домен, который работает. Текущие ссылки находятся здесь и здесь. - person Mark Haferkamp; 23.05.2015

Я делал это раньше, используя макрос, определяемый клавиатурой. Я бы загрузил все файлы в emacs (что-то вроде find . -name "*.cpp" | xargs emacs), а затем набрал следующие ключи. Я прокомментировал каждую комбинацию клавиш тем, что она делает.

C-x-(                  'Begin recording macro
M-<                    'Go to start of file
C-space                'Mark current location (now start of file)
M->                    'Go to end of file
M-x indent-region      'Indent entire file according to coding style
C-x C-s                'Save the current buffer
C-x C-k                'Close the current buffer
C-x-)                  'End recording macro

Теперь вы можете запустить это в буфере, набрав C-x e. Если вы загрузили несколько файлов, вы можете запустить что-то вроде C-u 100 C-x e, чтобы запустить это на 100 файлах. Если это больше, чем количество файлов, это нормально, вы просто получите какой-то «звонок звонка» или другую ошибку, которую вы можете игнорировать после завершения всей обработки.

person Alex B    schedule 06.04.2009

Я считаю, что этот скрипт не делает переформатирования. Вместо этого это пример того, как создать собственный «стиль», как описано в: Руководство по режиму CC - Стили

В руководстве по режиму CC также говорится:

Если вы хотите переформатировать старый код, вам, вероятно, лучше использовать какой-либо другой инструмент, например. Отступ GNU, который имеет более мощные возможности переформатирования, чем режим CC.

Руководство по режиму CC — Ограничения и известные ошибки< /а>

person John Smith    schedule 04.04.2009
comment
Да, поэтому я хочу загрузить стиль и применить функцию буфера отступа. А затем проделайте это со всеми файлами. - person Frank; 04.04.2009
comment
Реиндент, да. Переформатировать, нет. Например, новые строки до/после фигурных скобок не изменяются. - person John Smith; 04.04.2009
comment
Я предлагаю вам использовать отступ вместо emacs. - person John Smith; 04.04.2009
comment
Но с отступом я не могу использовать файл стиля emacs, который определяет все форматирование, которое мне нужно...? - person Frank; 04.04.2009

Если вы хотите пометить исходные файлы в буфере dired, а затем запустить функцию для форматирования каждого из них, вы можете сделать что-то вроде этого:

(defun clean-file(filename)
  (your-function-goes-here))

(defun clean-each-dired-marked-file() 
  (interactive)
  (for-each-dired-marked-file 'clean-file))

(defun for-each-dired-marked-file(fn)
 "Do stuff for each marked file, only works in dired window"
 (interactive)
 (if (eq major-mode 'dired-mode)
     (let ((filenames (dired-get-marked-files)))
       (mapcar fn filenames))
   (error (format "Not a Dired buffer \(%s\)" major-mode))))
person justinhj    schedule 15.04.2009