- Format C/C++ Code Using Clang-Format
- Introduction
- Installation
- Format Configuration
- Run Code Formatting
- Lei Mao
- Интеграция ClangFormat и Notepad++
- Исходные требования
- Установка и настройка
- 1. Если Notepad++ еще не установлен, скачиваем и устанавливаем его
- 2. В Notepad++ устанавливаем плагин NppExec
- 3. Скачиваем исполняемый файл ClangFormat
- 4. Добавляем конфигурационные файлы для ClangFormat
- 5. Создаем скрипт для NppExec
- 6. В Notepad++ добавляем новый пункт меню для запуска скрипта
- 7. В Notepad++ настраиваем клавиатурную комбинацию для запуска скрипта
- Инструкция по использованию
- ClangFormat as alternative formatter
- .clang-format configuration files
- ClangFormat in CLion
- Review ClangFormat settings for a file
- Edit .clang-format files
- Export the formatter settings into a .clang-format file
- Форматирование исходного кода в Linux средствами ClangFormat: проблемы и решение
- Проблемы с форматированием и как их решить
- Решение
Format C/C++ Code Using Clang-Format
Introduction
In a collaborative project, code formatting software, such as Clang-Format, have been widely used to make sure that the code written by different people have uniform style and format. I have just learned some basic usages of Clang-Format and documented them in this blog post.
Installation
Format Configuration
In order to format our code, we need a configuration file .clang-format . This file could be generated from some pre-configured styles.
To generate .clang-format from style llvm , run the following command in the terminal.
Other candidate styles include google , chromium , mozilla , webkit , microsoft .
We could further modify the .clang-format file using our preferences. Below is my modified format file. More style examples could be found from Clang documentations.
Run Code Formatting
Clang-Format could format a single file or all files with the same file extension. For example, to format .cpp extension, run the following command in the terminal.
To format all .h , .c , .hpp , .cpp , .cu files together, run the following command in the terminal.
Lei Mao
Machine Learning, Artificial Intelligence, Computer Science.
Twitter Facebook LinkedIn GitHub G. Scholar E-Mail RSS
Format C/C++ Code Using Clang-Format was published on April 22, 2019 and last modified on August 22, 2020 by Lei Mao.
Источник
Интеграция ClangFormat и Notepad++
Исходные требования
Установка и настройка
1. Если Notepad++ еще не установлен, скачиваем и устанавливаем его
2. В Notepad++ устанавливаем плагин NppExec
NppExec позволяет вызывать сторонние приложения из Notepad++ и взаимодействовать с компонентами библиотеки Scintilla, на основе которой написан Notepad++.
Plugins –> Plugin Admin. –> NppExec –> Install
Notepad++ перезапустится, после чего появится каталог /plugins/NppExec/ и пункт меню Plugins –> NppExec
3. Скачиваем исполняемый файл ClangFormat
Для этого на странице https://llvm.org/builds/ находим и скачиваем установочный файл для Windows, например LLVM-X.X.X-rYYYYYY-win64.exe . Весь пакет можно не устанавливать, достаточно архиватором извлечь файл clang-format.exe . Можно использовать 7-zip: удаляем у файла расширение .exe , открываем файл при помощи 7-zip и извлекаем из подкаталога bin/ файл clang-format.exe . Помещаем файл clang-format.exe в каталог /plugins/NppExec/clang-format/ .
4. Добавляем конфигурационные файлы для ClangFormat
Конфигурационные файлы должны иметь название .clang-format или _clang-format . В них содержится набор правил (стилей) форматирования, формат которых описан в руководстве ClangFormat Style Options.
Для примера используем файлы из проектов Linux Kernel и Qt.
Скачанные с GitHub файлы .clang-format помещаем в соответствующие каталоги:
/plugins/NppExec/clang-format/LINUX_KERNEL/
/plugins/NppExec/clang-format/QT/
5. Создаем скрипт для NppExec
Открываем окно редактирования и запуска скриптов NppExec Plugins –> NppExec –> Execute. или нажимаем F6 . Копируем и вставляем в окно приведенный ниже текст скрипта и сохраняем скрипт под названием clang-format кнопкой Save. .
После запуска скрипт на основе выбранного стиля форматирования, заданного в переменной style , выбирает нужный файл .clang-format , проверяет дату его изменения и при необходимости копирует его во временный каталог. Туда же во временный файл копируется выделенный фрагмент исходного кода, после чего запускается clang-format.exe . Отформатированный фрагмент копируется обратно в окно Notepad++. Затем временный файл удаляется.
В ClangFormat нет возможности указать путь к конфигурационному файлу .clang-format . ClangFormat будет искать его в каталоге форматируемого файла и, если не найдет, перейдет к поиску в родительских каталогах. После окончания работы скрипта файл .clang-format останется во временном каталоге для того, чтобы не выполнять его копирование при каждом запуске форматирования.
На всех этапах работы скрипта выполняется проверка на ошибки, и при их возникновении открывается консольное окно NppExec, в которое выводится сообщение.
6. В Notepad++ добавляем новый пункт меню для запуска скрипта
Открываем Plugins –> NppExec –> Advanced Options. , в выпадающем списке Associated script выбираем название скрипта clang-format и нажимаем на кнопку Add/Modify .
Перезапускаем Notepad++, после чего появится пункт меню Plugins –> NppExec –> clang-format .
7. В Notepad++ настраиваем клавиатурную комбинацию для запуска скрипта
Будем использовать комбинацию Ctrl + I по аналогии с QtCreator. Открываем Settings –> Shortcut Mapper .
По умолчанию комбинация Ctrl + I занята, поэтому нужно ее освободить кнопкой Clear во вкладке Main Menu (строка 38 Split Lines в текущей версии Notepad++). После этого во вкладке Plugin commands присваиваем комбинацию Ctrl + I скрипту clang-format .
Готово, можем пользоваться!
Инструкция по использованию
Открываем файл с исходным кодом в Notepad++, выделяем нужный фрагмент или весь текст и нажимаем Ctrl + I . Если ничего не выделять, то будет отформатирована текущая строка.
Источник
ClangFormat as alternative formatter
ClangFormat is a popular code formatting tool that helps maintain common code style across team members and IDEs. It provides an option to store formatting settings in special YAML files named .clang-format or _clang-format . In CLion, you can use ClangFormat as an alternative to the built-in code formatter.
.clang-format configuration files
.clang-format files with formatting conventions should be placed in the project tree. Each of them applies to code files at the same level and in the subdirectories. Having multiple .clang-format files for a single project lets you, if needed, use different styles for different code folders.
ClangFormat offers many style options, which you can mix to create the set of rules most suitable for your team. It also provides several built-in styles for C/C++: LLVM, Google, WebKit, Chromium, and Mozilla. These predefined styles can be used as is or as a baseline for your custom set of style definitions.
To generate a .clang-format file with, for example, LLVM code style, run the following command (make sure to have ClangTools already installed):
To help you create .clang-format files, there are handy interactive builders: clangformat.com and the alternative one, clang-format configurator
ClangFormat in CLion
CLion automatically enables ClangFormat and applies the settings when there is a .clang-format file under your project root. You can also enable/disable ClangFormat using one of the following options:
While in a .h , .c , or .cpp file, click Enable ClangFormat from the code formatting switcher in the status bar:
Alternatively, select the Enable ClangFormat checkbox in Settings/Preferences | Editor | Code Style :
If there is no .clang-format file under the project root, CLion will suggest creating it based on the current IDE code style settings. If you refuse, then ClangFormat will be enabled with the default LLVM style.
When you create a new project with ClangFormat enabled, CLion automatically generates a .clang-format file for it based on the current code style.
After you enable ClangFormat , the appropriate formatting will be applied when you:
type in the editor (which includes indentation after Enter or Backspace , auto-completion, code generation, refactorings, and quick-fixes);
call Code | Reformat Code Ctrl+Alt+L — this action also lets you reformat a selection of code instead of the whole file;
commit changes and select Reformat Code as the Before commit action:
Review ClangFormat settings for a file
Open the file in the editor and click View ClangFormat options for . from the toolbar switcher:
CLion will show the list of settings taken from the corresponding .clang-format file:
This list is currently read-only. To edit the settings, change them right in the .clang-format file.
Edit .clang-format files
Open the desired source file in the editor and click Edit ‘.clang-format’ for. from the toolbar switcher:
To help you edit .clang-format configs, CLion provides code assistance by validating the file content against the JSON Schema built specifically for ClangFormat . Code assistance includes:
Completion for options and values, with option descriptions shown in the popup:
Checking the option values for consistency with the allowed value set:
Quick documentation popup Ctrl+Q to help you explore the option details:
Export the formatter settings into a .clang-format file
When you need to save or share the settings of the built-in code formatter, you can export them into a .clang-format file:
Go to Settings / Preferences | Editor | Code Style | C/C++ .
Click next to the Scheme field and select Export | .clang-format File :
In the dialog that opens, specify the filename and location. By default, CLion suggests .clang-format and the current project root.
Источник
Форматирование исходного кода в Linux средствами ClangFormat: проблемы и решение
Согласитесь, приятно и полезно, когда в проекте исходный код выглядит красиво и единообразно. Это облегчает его понимание и поддержку. Покажем и расскажем, как реализовать форматирование исходного кода при помощи clang-format, git и sh.
Проблемы с форматированием и как их решить
В большинстве проектов существуют определенные правила оформления кода. Как сделать так, чтобы все участники их выполняли? На помощь приходят специальные программы — clang-format, astyle, uncrustify, — но у них есть свои недостатки.
Главная проблема форматеров состоит в том, что они меняют файлы целиком, а не только изменённые строки. Расскажем, как мы с этим справились, используя ClangFormat в рамках одного из проектов по разработке встроенного ПО для электроники, где С++ был основным языком. В команде работало несколько человек, поэтому для нас было важно обеспечить единый стиль кода. Наше решение может подойти не только программистам С++, но и тем, кто пишет код на C, Objective-C, JavaScript, Java, Protobuf.
Для форматирования мы использовали clang-format-diff-6.0. На старте запустили команду
git diff -U0 —no-color | clang-format-diff-6.0 -i -p1, но с ней возникли проблемы:
- Программа определяла типы файлов только по расширению. Например, файлы с расширением ts, которые у нас имели формат xml, воспринимала как JavaScript и падала при форматировании. Потом, она зачем-то пыталась поправить pro-файлы проектов Qt, наверное, как Protobuf.
- Программу приходилось запускать вручную, перед добавлением файлов в индекс git. Легко было об этом забыть.
Решение
В результате получился следующий sh-скрипт, запускаемый как pre-commit — хук для git:
Что делает скрипт:
GIT_DIFF=» git diff -U0 —no-color « — изменения в коде, которые подадут на вход clang-format-diff-6.0.
- -U0: обычно git diff выводит так называемый «контекст»: несколько неизменёных строк кода вокруг тех, что были изменены. Но clang-format-diff-6.0 форматирует их тоже! Поэтому контекст в данном случае не нужен.
CLANG_FORMAT=» clang-format-diff-6.0 -p1 -v -sort-includes -style=Chromium -iregex ‘.*\.(cxx|cpp|hpp|h)$’ « — команда для форматирования diff, полученного через стандартный ввод.
- clang-format-diff-6.0 — скрипт из пакета clang-format-6.0. Есть другие версии, но все тесты были только на этой.
- -p1 взят из примеров в документации, обеспечивает совместимость с выводом git diff.
- -style=Chromium — готовый пресет стиля форматирования кода. Другие возможные значения: LLVM, Google, Mozilla, WebKit.
- -sort-includes — опция сортировки по алфавиту директив #include (не обязательна).
- -iregex ‘.*\.(cxx|cpp|hpp|h)$’ — регулярное выражение, фильтрующее имена файлов по расширениям. Тут перечислены только те расширения, которые надо форматировать. Это убережёт программу от падения и неожиданных глюков. Скорее всего список нужно будет дополнить в новых проектах. Кроме С++ можно форматировать C/Objective-C/JavaScript/Java/Protobuf. Хотя эти типы файлов мы не тестировали.
GIT_APPLY=» git apply -v -p0 — « — применение к коду патча, выданного предыдущей командой.
- -p0: по умолчанию git apply пропускает первый компонент в пути к файлу, это несовместимо с форматом, который выдаёт clang-format-diff-6.0. Здесь отключено такое пропускание.
FORMATTER_DIFF=$(eval $
echo «$
eval $
Источник