clang-format是基于clang的一个命令行工具。这个工具能够自动化格式C/C++/Obj-C代码,支持多种代码风格:Google, Chromium, LLVM, Mozilla, WebKit,也支持自定义风格(通过编写.clang-format文件)。这个工具是我组manager写的。

这个工具非常好用,特别对于我这种习惯了Google Chromium风格,转去写LLVM风格代码。尽管注意地去遵守LLLVM风格,但有时还是会出错。clang-format能去除代码风格的人为错误,从此妈妈再也不用担心code review时的代码风格错误啦。

主要用法:

1
2
3
4
5
6
7
8
9
10
11
// OS X 需要先安装
brew install clang-format
// 以LLVM代码风格格式化main.cpp, 结果输出到stdout
clang-format main.cpp -style=LLVM
// 以LLVM代码风格格式化main.cpp, 结果直接写到main.cpp
clang-format -i main.cpp -style=LLVM
// 当然也支持对指定行格式化,格式化main.cpp的第1,2行
clang-format -lines=1:2 main.cpp

clang-format当然少不了与编辑器集成。官网上就有各编辑器集成教程。

vim的集成是通过clang-format.py脚本实现的,但是发现没有达到我想要的功能。
我想要的是能够通过不同快捷键就能实现LLVMChromium风格代码的格式化和支持指定行代码的格式化。

幸运的是,已经有别人完成这个工作了,那就是vim-autoformat插件,把下面代码添加到.vimrc配置文件里:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Bundle 'Chiel92/vim-autoformat'
"clang-format for formating cpp code
nnoremap <leader>cf :call FormatCode("Chromium")<cr>
nnoremap <leader>lf :call FormatCode("LLVM")<cr>
vnoremap <leader>cf :call FormatCode("Chromium")<CR>
vnoremap <leader>lf :call FormatCode("LLVM")<cr>
let g:autoformat_verbosemode = 1
func FormatCode(style)
let firstline=line(".")
let lastline=line(".")
" Visual mode
if exists(a:firstline)
firstline = a:firstline
lastline = a:lastline
endif
let g:formatdef_clangformat = "'clang-format --lines='.a:firstline.':'.a:lastline.' --assume-filename='.bufname('%').' -style=" . a:style . "'"
let formatcommand = ":" . firstline . "," . lastline . "Autoformat"
exec formatcommand
endfunc

看看下面的效果:

clang-format

另外clang-format还提供一个clang-format-diff.py脚本,用来格式化patch,code review提交代码前,可以先跑一下这个脚本,看有没有问题。

1
2
// 格式化最新的commit,并直接在原文件上修改
git diff -U0 HEAD^ | clang-format-diff.py -i -p1