Ответ 1
Как насчет:
clang-format -i -style=WebKit *.cpp *.h
в папке проекта. Опция -i делает его на месте (по умолчанию форматированный вывод записывается в стандартный вывод).
Есть ли способ вызвать что-то вроде clang-format --style=Webkit
для всей папки проекта cpp, вместо того, чтобы запускать его отдельно для каждого файла?
Я использую clang-format.py
и vim
для этого, но я предполагаю, что есть способ применить это один раз.
Как насчет:
clang-format -i -style=WebKit *.cpp *.h
в папке проекта. Опция -i делает его на месте (по умолчанию форматированный вывод записывается в стандартный вывод).
К сожалению, не существует способа рекурсивно применять clang-format. *.cpp
будет соответствовать файлам только в текущем каталоге, а не в подкаталогах. Даже **/*
не работает.
К счастью, есть решение: возьмите все имена файлов с помощью команды find
и подключите их. Например, если вы хотите отформатировать все файлы .h
и .cpp
в каталоге foo/bar/
рекурсивно, вы можете сделать
find foo/bar/ -iname *.h -o -iname *.cpp | xargs clang-format -i
Подробнее см. здесь.
Сначала создайте файл .clang-format
, если он не существует:
clang-format -style=WebKit -dump-config > .clang-format
Выберите любой предопределенный стиль или отредактируйте полученный файл .clang-format
.
Затем запустите:
find . -regex '.*\.\(cpp\|hpp\|cc\|cxx\)' -exec clang-format -style=file -i {} \;
В регулярном выражении можно использовать другие расширения файлов, кроме cpp
, hpp
, cc
и cxx
, просто разделите их с помощью \|
.
Недавно я нашел bash-скрипт, который делает именно то, что вам нужно:
https://github.com/eklitzke/clang-format-all
Это bash-скрипт, который будет запускать
clang-format -i
для вашего кода.Особенности:
- Находит правильный путь к
clang-format
в Ubuntu/Debian, который кодирует версию LLVM в имени файлаclang-format
- Исправляет файлы рекурсивно
- Определяет наиболее распространенные расширения файлов, используемые проектами C/C++
На Windows я успешно использовал его в Git Bash и WSL.
Для пользователей Windows: если у вас есть поддержка Powershell 3.0, вы можете сделать:
Get-ChildItem -Path . -Directory -Recurse |
foreach {
cd $_.FullName
&clang-format -i -style=WebKit *.cpp
}
Примечание 1: Используйте pushd.
и popd
если вы хотите иметь один и тот же текущий каталог до и после скрипта
Примечание 2: скрипт работает в текущем рабочем каталоге
Примечание 3: это может быть написано в одну строку, если это действительно важно для вас
Я использую следующую команду для рекурсивного форматирования всех файлов target-C в текущей папке:
$ find . -name "*.m" -o -name "*.h" | sed 's| |\\ |g' | xargs clang-format -i
Я определил следующий псевдоним в своем .bash_profile
чтобы упростить процесс:
# Format objC files (*.h and *.m) under the current folder, recursively
alias clang-format-all="find . -name \"*.m\" -o -name \"*.h\" | sed 's| |\\ |g' | xargs clang-format -i"