有没有办法用Vim自动重新格式化括号?

时间:2010-12-16 16:46:18

标签: formatting vim

我想重新格式化一些看起来像这样的代码:

if (cond) {
  foo;
}

if (cond)
{
  foo;
} 

由于这是C代码,我一直在考虑cindent / cinoptions=一起使用,但似乎它不涉及多线规则。

我一直在考虑formatoptionsgq一起使用,而且似乎也不可能。

可以使用默认的Vim选项,还是应该使用特定的插件或函数?

4 个答案:

答案 0 :(得分:5)

我不知道这是否完全解决了你的问题,但如果这是一次性操作,你可能想尝试正则表达式:

:%s/^\(\s*\)\(.*)\)\s*{\s*$/\1\2^M\1{/

请注意,^M是一个控制字符,通常按 CTRL-V 后跟 ENTER 生成(取决于您的终端)。

编辑:正如Jay和Zyx的评论中所指出的,\r是一种更换插入换行字符串的方法。我没有意识到这一点,非常感谢提示。

答案 1 :(得分:5)

:%s/^\(\s*\).*\zs{\s*$/\r\1{/

故障:

^\(\s*\) =捕获行开头的空白

.* =其他一切

\zs =在此

之后开始替换

{ =打开大括号

\s*$ =在行结束前尾随空格

\r\1{ =换行符,捕获的空格,大括号

答案 2 :(得分:4)

如果您安装Artistic Style,您可以执行以下操作:

:set formatprg=astyle\ -b

然后使用gq重新格式化代码块。强调文本

如果您希望每次编辑C文件时都启用此功能, 您可以将以下内容添加到.vimrc文件中。

autocmd BufNewFile,BufRead *.c set formatprg=astyle\ -b

答案 3 :(得分:1)

我不知道你是否可以在vim中做到这一点,但你可以尝试使用indent选项的BSD -bl命令。将光标放在第一个{上,您可以键入 indent -bl 输入