Настройки стиля Google c для отступов gnu?

Я использую стиль отступов google c для Emacs (google-c-style.el) и Vim (google.vim).

Но так как у меня есть какой-то существующий код, который не является этим стилем, и я надеюсь, что смогу его изменить. Я нахожу, что есть инструмент под названием GNU indent, который может делать это автоматически, и он предоставляет некоторые общие настройки стиля на этой странице, однако для стиля отступов Google c нет. SO тоже эквивалентен для этого?

(Я пробовал стиль Linux и Berkley и считаю, что они отнюдь не удовлетворительны для меня)

Ответ 1

Краткое описание стиля кодирования google показывает, что в основном это стиль кодирования K & R, за исключением двух пространственных отступов (включая case case), 80 строк столбцов и без вкладок. Таким образом, следующие параметры должны выполнить следующее:

-kr -ci2 -cli2 -i2 -l80 -nut

Начните с этого. Возможно, вам придется настроить полученный код. Поддержка С++, в частности, слаба для indent.

Условные обозначения:

  • -kr: стиль K & R
  • -ci2: отступ продолжения, строки, следующие за первой строкой многострочного кода, получают отступы на 2 пробела.
  • -cli2: отступ метки ярлыка, метки case имеют отступы 2 пробела от switch
  • -i2: отступы, 2 пробела
  • -l80: длина, 80 столбцов
  • -nut: нет вкладок

В качестве альтернативы вы можете рассмотреть выполнение emacs в пакетном режиме для применения отступов в вашем коде для вас. Вкратце:

Создайте файл с именем emacs-format-file с содержимым:

(defun emacs-format-function ()
   "Format the whole buffer."
   (c-set-style "Google")
   (indent-region (point-min) (point-max) nil)
   (untabify (point-min) (point-max))
   (save-buffer))

Выполните следующую команду из оболочки:

emacs -batch your_source_file.c \
    -l emacs-format-file -f emacs-format-function

Ответ 2

Для записи есть альтернативное решение для тех, кто интересуется Clang и LLVM.

clang-format определенно может легко и эффективно форматировать существующий исходный код. Он имеет явную встроенную поддержку формата 5, а именно LLVM (по умолчанию), Google, Chromium, Mozilla, WebKit.

Простым способом форматирования файла с помощью стиля Google является:

clang-format -style=Google -i filename

Где -i означает модификацию места, вы можете попробовать без этой опции просмотреть изменения.

Для пакетного форматирования существующего кода C/С++ мы можем просто использовать команду:

find . -name "*.cc" | xargs clang-format -style=Google -i

Помимо перечисленных 5 форматов, существуют, например, другие стили, такие как GNU (добавлено в версия 197138, очень жаль, что документ не синхронизируется).

Обратите внимание, что clang-format принимает файлы типа rc, такие как .clang-format или _clang-format в проекте, самый простой способ добавить такой файл конфигурации (например, сказал в официальной странице руководства по формату clang) - это сбросить конфигурацию существующего формата, например:

clang-format -style=Google -dump-config >.clang-format

Также вы можете также использовать опцию BasedOnStyle, чтобы файл конфигурации выглядел следующим образом:

---
BasedOnStyle:  Chromium
PointerBindsToType: false
ObjCSpaceAfterProperty: true
...

Используйте .clang-format или _clang-format в качестве ключевых слов для поиска в Github и других образцов; или вы можете обратиться к этому сайту, чтобы помочь создать его.

Есть также интеграция для IDE/редакторов, таких как Visual Studio (в каталоге clang-format-vs), Sublime, Emacs, Vim (все в каталог clang-format).

Еще 3 подсказки:

  • Для интеграции Emacs (clang-format.el) лично я считаю, что лучше привязать ключ для clang-format-buffer, а не clang-format-region.

  • Для установки в Mac OSX homebrew используйте brew install --with-clang, --with-lld, --with-python --HEAD llvm, чтобы получить поддержку clang-format, а ее файлы интеграции находятся в $(brew --cache)/llvm--clang--svn-HEAD/tools/clang-format (бонус: там есть git-clang-format!!).

  • В clang-extra-tools, например clang-modernize (который используется для" автоматического преобразования кода на С++, написанного по старым стандартам, для использования возможностей новейшего стандарта С++, где это необходимо"), действительно заслуживающего попробовать!