Есть ли способ вызвать что-то вроде clang-format --style=Webkit
для всей папки проекта cpp, а не запускать ее отдельно для каждого файла?
Я использую clang-format.py
и vim
для этого, но полагаю, что есть способ применить это один раз.
Есть ли способ вызвать что-то вроде clang-format --style=Webkit
для всей папки проекта cpp, а не запускать ее отдельно для каждого файла?
Я использую clang-format.py
и vim
для этого, но полагаю, что есть способ применить это один раз.
Ответы:
Что о:
clang-format -i -style=WebKit *.cpp *.h
в папке проекта. Параметр -i делает его на месте (по умолчанию форматированный вывод записывается в стандартный вывод).
**
конструкцию.
clang-tidy
?
*.cpp
для создания списка файлов должно работать. Команда clang-tidy
позволяет передавать несколько файлов. `USAGE: clang-tidy [options] <source0> [... <sourceN>]` Однако на практике это может быть не лучшим способом. Clang-tidy выполняет гораздо более глубокий анализ, поэтому для него требуются флаги компилятора для каждого файла и т. Д. Когда я использовал clang-tidy, у меня обычно была «база данных компиляции» - файл JSON с командами для каждого файла и некоторый сценарий, который пошел над ним. Это было пару лет назад, может быть, есть способ получше.
К сожалению, рекурсивно применить формат clang невозможно. *.cpp
будет соответствовать только файлам в текущем каталоге, но не подкаталогам. Даже **/*
не работает.
К счастью, есть решение: захватить с помощью find
команды все имена файлов и передать их по конвейеру. Например, если вы хотите рекурсивно форматировать все файлы .h
и .cpp
файлы в каталоге foo/bar/
, вы можете сделать
find foo/bar/ -iname *.h -o -iname *.cpp | xargs clang-format -i
См. Здесь для дополнительного обсуждения.
**/*.cpp
похоже, работает в (достаточно современном) bash. Возможно, вам придется это сделать shopt -s globstar
раньше.
GLOB_RECURSE
найти все .cpp
файлы и передать их clang-format
.
find
и xargs
должна использовать find ... -print0
и xargs -0 ...
для обеспечения правильной обработки всех типов имен файлов.
find foo/bar/ -iname '*.h' -o -iname '*.cpp' | xargs clang-format -i
устранит проблему.
Сначала создайте .clang-format
файл, если он не существует:
clang-format -style=WebKit -dump-config > .clang-format
Выберите любой предопределенный стиль или отредактируйте полученный .clang-format
файл.
Конфигуратор clang-формата полезен.
Затем запустите:
find . -regex '.*\.\(cpp\|hpp\|cc\|cxx\)' -exec clang-format -style=file -i {} \;
Другие расширения файлов , чем cpp
, hpp
, cc
и cxx
может быть использован в регулярном выражении, просто убедитесь , что отделить их \|
.
-style=file
есть ли способ указать собственный путь к файлу? Я попробовал, -style=~/.clang-format
но ничего не вышло.
cp ~/.clang-format .
команду find в вашем ответе.
Недавно я нашел 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: это, вероятно, можно записать в одну строку, если это было действительно важно для вас
Я использую следующую команду для рекурсивного форматирования всех файлов objective-C в текущей папке :
$ find . -name "*.m" -o -name "*.h" | sed 's| |\\ |g' | xargs clang-format -i
.bash_profile
Чтобы упростить задачу, я определил в my следующий псевдоним :
# 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"
Вот решение, которое выполняет рекурсивный поиск и передает все файлы в формат clang в виде списка файлов одной командой. Он также исключает каталог «build» (я использую CMake), но вы можете просто опустить шаг «grep», чтобы удалить его.
shopt -s globstar extglob failglob && ls **/*.@(h|hpp|hxx|c|cpp|cxx) | grep -v build | tr '\n' ' ' | xargs clang-format -i
В современном bash вы можете рекурсивно сканировать дерево файлов
for file_name in ./src/**/*.{cpp,h,hpp}; do
if [ -f "$file_name" ]; then
printf '%s\n' "$file_name"
clang-format -i $file_name
fi
done
Здесь предполагается, что источник находится в, ./src
и .clang-format
содержит информацию о форматировании.
clang-format-3.6 -i -style=file *.cpp *.h *.hpp