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

use*_*557 64 c++ clang clang-format

有没有办法在cpp项目文件夹上调用类似"clang-format --style = Webkit"的东西,而不是在每个代码中单独运行它?

我正在使用clang-format.py和vim来执行此操作.但我认为有一种更简单的方法可以应用这一次.

Ant*_*ony 63

不幸的是,没有办法递归地应用clang格式.*.cpp将仅匹配当前目录中的文件,而不是子目录.即使**/*不起作用.

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

find foo/bar/ -iname *.h -o -iname *.cpp | xargs clang-format -i
Run Code Online (Sandbox Code Playgroud)

请参阅此处以获取更多讨论

  • 好吧,`**/*.cpp`似乎适用于(合理的现代)bash.你之前可能需要`shopt -s globstar`. (6认同)
  • `find`和`xargs`的组合应该使用`find ... -print0`和`xargs -0 ...`来确保正确处理所有类型的文件名. (2认同)
  • 如果pwd中存在任何.cpp或.h文件,此命令将失败。查找foo / bar / -iname'* .h'-o -iname'* .cpp'| xargs clang-format -i`将解决此问题。 (2认同)

sba*_*ski 33

关于什么:

clang-format -i -style=WebKit *.cpp *.h
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,这不会递归到子目录中. (23认同)
  • 是的,*。cpp将被外壳扩展。clang只需要一个文件列表。更多高级选项(例如递归glob)取决于shell的功能。有关如何使用**结构的信息,请参见http://unix.stackexchange.com/questions/49913/recursive-glob。 (4认同)
  • 或者如果您正在使用配置文件并想要格式化多种文件类型:`clang-format-3.6 -i -style=file *.cpp *.h *.hpp` (2认同)

Ale*_*der 15

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

clang-format -style=WebKit -dump-config > .clang-format
Run Code Online (Sandbox Code Playgroud)

然后运行:

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


Jul*_*ger 9

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

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

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

特征:

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

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


Mic*_*ter 9

当您使用 Windows (CMD) 但不想使用 PowerShell 大炮来射击这只苍蝇时,请尝试以下操作:

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

不要忘记%在 cmd 脚本中复制两个 if 。


Gab*_*les 6

下面的脚本和流程:

  1. 在Linux下工作
  2. 应该可以在MacOS上运行
  3. 下载并安装后,可在Windows内的Git For Windows终端中运行。clang-format

我是这样做的:

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

运行_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
Run Code Online (Sandbox Code Playgroud)

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

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

chmod +x run_clang_format.sh
Run Code Online (Sandbox Code Playgroud)

...并运行它:

./run_clang_format.sh
Run Code Online (Sandbox Code Playgroud)

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

~/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 Code Online (Sandbox Code Playgroud)

您可以在我的eRCaGuy_PPM_Writer存储库和我的eRCaGuy_CodeFormatterrun_clang_format.sh存储库中找到我的文件。我的文件也在那里.clang-format

参考:

  1. 我的存储库:
    1. 更新:请参见此处:https://github.com/ElectricRCAircraftGuy/eRCaGuy_CodeFormatter
    2. eRCaGuy_PPM_Writer存储库
    3. run_clang_format.sh文件
  2. 我关于如何clang-format在我的eRCaGuy_dotfiles存储库中的“git & Linux cmds、help、tips &ricks - Gabriel.txt”文档中使用的注释(在文档中搜索“clang-format”)。
  3. 官方clang-format文档、设置、说明等!https://clang.llvm.org/docs/ClangFormat.html
  4. 在此处下载clang-format适用于 Windows 的自动格式化程序/linter 可执行文件或其他安装程序/可执行文件:https://llvm.org/builds/
  5. Clang 格式样式选项:https://clang.llvm.org/docs/ClangFormatStyleOptions.html
  6. [我的回答]如何从脚本本身获取 Bash 脚本所在的目录?

有关的:

  1. [我的答案]使用 clang-format 缩进预处理器指令

也可以看看:

  1. [我的答案] /sf/ask/4737497201/#67678570


Tim*_*yer 5

对于 Windows 用户:如果您有 Powershell 3.0 支持,您可以:

Get-ChildItem -Path . -Directory -Recurse |
    foreach {
        cd $_.FullName
        &clang-format -i -style=WebKit *.cpp
    }
Run Code Online (Sandbox Code Playgroud)

注1:使用pushd .popd,如果你想之前和脚本后,具有相同的当前目录

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

注3:如果这对您来说真的很重要,这可能可以写在一行中