我如何在vim中自动格式化/缩进C代码?
当我从另一个文件复制代码时,格式化会搞砸,如下所示:
fun() { for(...) { for(...) { if(...) { } } } }
我怎样才能自动在vim这个代码?
尝试以下击键:
gg=G
说明: gg
进入文件的顶部, =
是一个固定缩进的命令, G
告诉它执行到文件末尾的操作。
我喜欢使用艺术风格的程序。 根据他们的网站 :
艺术风格是C,C ++,C#和Java编程语言的源代码压缩,格式化和美化。
它运行在Window,Linux和Mac上。 它会做缩进,用空格replace标签,反之亦然,在你喜欢的地方放置空格(把if(x<2)
转换成if(x<2)
,如果你喜欢的话)与函数定义相同的行,或将它们移动到下面的行等。所有选项都由命令行参数控制。
为了在vim中使用它,只需将formatprg选项设置为它,然后使用gq命令。 所以,例如,我在我的.vimrc中:
autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb
所以无论何时打开一个.cpp文件,formatprg都是用我喜欢的选项设置的。 然后,我可以inputgg到文件的顶部,然后按照我的标准格式化整个文件。 如果我只需要重新格式化一个函数,我可以到函数的顶部,然后键入g q [ ] ,它将重新格式化这个函数。
我对astyle的选项-T4pb
只是我的偏好。 您可以查看他们的文档 ,然后更改选项,然后按照您的喜好对代码进行格式化。
这是一个演示。 在astyle之前:
int main(){if(x<2){x=3;}} float test() { if(x<2) x=3; }
之后(gggqG):
int main() { if (x < 2) { x = 3; } } float test() { if (x < 2) x = 3; }
希望有所帮助。
OP要求自动格式化,但接受了只能自动缩进的答案。
以下是区别:
原版的
int main(){if(x<2){x=3;}} float test() { if(x<2) x=3; }
自动缩进
int main(){if(x<2){x=3;}} float test() { if(x<2) x=3; }
自动套用格式
int main() { if (x < 2) { x = 3; } } float test() { if (x < 2) x = 3; }
已经提到了用于正确缩进代码的内build命令( gg=G
)。 如果您想美化代码,则需要使用外部应用程序(如缩进) 。 由于%
表示ex模式下的当前文件,所以可以像这样使用它:
:!indent %
插件vim-autoformat让你只用一个button就可以格式化缓冲区: https : //github.com/Chiel92/vim-autoformat 。 它使用外部格式的程序,回退到vim的缩进function。
我发现clang-format
运作良好。
在clang文档中有一些例子的关键字
我更喜欢在vim中使用equalprg
绑定。 这允许你用G=gg
或其他=
indent选项调用clang-format
。
只需将以下内容放在.vimrc文件中:
autocmd FileType c,cpp setlocal equalprg=clang-format
我喜欢上面提到的indent
,但是大多数时候我只想格式化我正在处理的一小部分文件。 由于indent
可以从stdin中获取代码,因此非常简单:
- select你想用V或类似格式的代码块。
- input格式
:!indent
。
astyle
需要stdin,所以你可以在那里使用相同的技巧。
也许你可以试试以下$ indent -kr -i8 * .c
希望它对你有用!
我想补充一点,为了防止它被弄乱,你可以input:set paste
之前:set paste
粘贴。 粘贴后,您可以键入:set nopaste
的东西,如js美化和缩进再次工作。
他们是一个叫indent
的工具。 您可以使用apt-get indent
下载它,然后运行indent my_program.c
。