Чи є спосіб викликати щось на зразок 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 робить це місцем (за замовчуванням відформатований вивід записується в stdout).
**
конструкцію.
clang-tidy
?
*.cpp
для створення списку файлів має спрацювати. clang-tidy
Команда дозволяє передачу кількох файлів. `ВИКОРИСТАННЯ: 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: Це, можливо, можна написати в один рядок, якщо це було для вас дійсно важливим
Я використовую таку команду для рекурсивного форматування всіх файлів об’єкта-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"
Ось рішення, яке здійснює рекурсивний пошук та передає всі файли у формат 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