如何在cpp项目文件夹上调用clang-format?

时间:2015-03-06 10:31:49

标签: c++ clang clang-format

有没有办法为整个cpp项目文件夹调用clang-format --style=Webkit之类的东西,而不是为每个文件分别运行它?

我正在使用clang-format.pyvim来执行此操作,但我认为有一种方法可以应用此功能。

10 个答案:

答案 0 :(得分:53)

不幸的是,没有办法递归地应用clang格式。 *.cpp只匹配当前目录中的文件,而不匹配子目录。即使**/*也无效。

幸运的是,有一个解决方案:使用find命令获取所有文件名并将其输入。例如,如果要格式化所有.h.cpp文件递归目录foo/bar/,你可以做

find foo/bar/ -iname *.h -o -iname *.cpp | xargs clang-format -i

有关其他讨论,请参阅here

答案 1 :(得分:25)

怎么样:

clang-format -i -style=WebKit *.cpp *.h

在项目文件夹中。 -i选项使其处于原位(默认情况下,格式化输出将写入stdout)。

答案 2 :(得分:9)

如果文件不存在,首先创建一个.clang-format文件:

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

然后运行:

find . -regex '.*\.\(cpp\|hpp\|cc\|cxx\)' -exec clang-format -style=file -i {} \;

答案 3 :(得分:5)

我最近发现了一个bash脚本,可以完全满足您的需求:

https://github.com/eklitzke/clang-format-all

  

这是一个bash脚本,可以在您的代码上运行clang-format -i

     

特点:

     
      
  • 在Ubuntu / Debian上找到clang-format的正确路径,它以clang-format文件名
  • 编码LLVM版本   
  • 递归修复文件
  •   
  • 检测C / C ++项目使用的最常见文件扩展名
  •   

在Windows上,我在Git Bash和WSL中成功使用它。

答案 4 :(得分:3)

以下脚本和流程:

  1. 适用于 Linux
  2. 应该适用于 MacOS
  3. 在带有 clang-format Git For Windowsdownloaded and installed 终端内的 Windows 中工作。

这是我的做法:

我创建了一个 run_clang_format.sh 脚本并将其放在我的项目目录的根目录中,然后我从任何地方运行它。这是它的样子:

run_clang_format.sh

#!/bin/bash

THIS_PATH="$(realpath "$0")"
THIS_DIR="$(dirname "$THIS_PATH")"

# Find all files in THIS_DIR which end in .ino, .cpp, etc., as specified
# in the regular expression just below
FILE_LIST="$(find "$THIS_DIR" | grep -E ".*(\.ino|\.cpp|\.c|\.h|\.hpp|\.hh)$")"

echo -e "Files found to format = \n\"\"\"\n$FILE_LIST\n\"\"\""

# Format each file.
# - NB: do NOT put quotes around `$FILE_LIST` below or else the `clang-format` command will 
#   mistakenly see the entire blob of newline-separated file names as a SINGLE file name instead 
#   of as a new-line separated list of *many* file names!
clang-format --verbose -i --style=file $FILE_LIST

使用 --style=file 意味着我还必须有一个相同级别的自定义 .clang-format clang 格式说明符文件,我就是这样做的。

现在,使您新创建的 run_clang_format.sh 文件可执行:

chmod +x run_clang_format.sh

...并运行它:

./run_clang_format.sh

这是我的示例运行和输出:

~/GS/dev/eRCaGuy_PPM_Writer$ ./run_clang-format.sh 
Files found to format = 
"""
/home/gabriel/GS/dev/eRCaGuy_PPM_Writer/examples/PPM_Writer_demo/PPM_Writer_demo.ino
/home/gabriel/GS/dev/eRCaGuy_PPM_Writer/examples/PPM_Writer_demo2/PPM_Writer_demo2.ino
/home/gabriel/GS/dev/eRCaGuy_PPM_Writer/src/eRCaGuy_PPM_Writer.h
/home/gabriel/GS/dev/eRCaGuy_PPM_Writer/src/eRCaGuy_PPM_Writer.cpp
/home/gabriel/GS/dev/eRCaGuy_PPM_Writer/src/timers/eRCaGuy_TimerCounterTimers.h
"""
Formatting /home/gabriel/GS/dev/eRCaGuy_PPM_Writer/examples/PPM_Writer_demo/PPM_Writer_demo.ino
Formatting /home/gabriel/GS/dev/eRCaGuy_PPM_Writer/examples/PPM_Writer_demo2/PPM_Writer_demo2.ino
Formatting /home/gabriel/GS/dev/eRCaGuy_PPM_Writer/src/eRCaGuy_PPM_Writer.h
Formatting /home/gabriel/GS/dev/eRCaGuy_PPM_Writer/src/eRCaGuy_PPM_Writer.cpp
Formatting /home/gabriel/GS/dev/eRCaGuy_PPM_Writer/src/timers/eRCaGuy_TimerCounterTimers.h

您可以在我的 run_clang_format.sh 存储库以及我的 eRCaGuy_PPM_Writer 存储库中找到我的 eRCaGuy_CodeFormatter 文件。

参考:

  1. 我的存储库:
    1. eRCaGuy_PPM_Writer 存储库
    2. run_clang_format.sh file
  2. 关于如何在我的 "git & Linux cmds, help, tips & tricks - Gabriel.txt" 存储库中的 eRCaGuy_dotfiles 文档中使用 clang-format 的笔记(在文档中搜索“clang-format”)。
  3. 官方 clang-format 文档、设置、说明等! https://clang.llvm.org/docs/ClangFormat.html
  4. 在此处下载适用于 Windows 的 clang-format 自动格式化程序/linter 可执行文件或其他安装程序/可执行文件:https://llvm.org/builds/
  5. Clang 格式样式选项:https://clang.llvm.org/docs/ClangFormatStyleOptions.html
  6. [我的回答] How can I get the source directory of a Bash script from within the script itself?

相关:

  1. [我的回答] Indenting preprocessor directives with clang-format

另见:

  1. [我的回答] Fixing a simple C code without the coments

答案 5 :(得分:2)

当您使用 Windows (CMD) 但不想使用 PowerShell 大炮来射击这只苍蝇时,试试这个:

for /r %t in (*.cpp *.h) do clang-format -i -style=WebKit "%t"

如果在 cmd 脚本中,请不要忘记复制两个 %

答案 6 :(得分:0)

对于Windows用户:如果您具有Powershell 3.0支持,则可以执行以下操作:

Get-ChildItem -Path . -Directory -Recurse |
    foreach {
        cd $_.FullName
        &clang-format -i -style=WebKit *.cpp
    }

注意1:如果要在脚本前后拥有相同的当前目录,请使用pushd .popd

注2:该脚本在当前工作目录中运行

注意3:如果这对您确实很重要,则可以将其写成一行

答案 7 :(得分:0)

我正在使用以下命令来递归地格式化当前文件夹下的所有Objective-C文件:

store    level4
1        2
2        1
3        0
4        0

为了方便起见,我在$ find . -name "*.m" -o -name "*.h" | sed 's| |\\ |g' | xargs clang-format -i 中定义了以下别名:

.bash_profile

答案 8 :(得分:0)

这是一种解决方案,它可以递归搜索,并在一个命令中将所有文件作为文件列表以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

答案 9 :(得分:0)

在现代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包含格式信息。