Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Formatting 有没有办法用Vim自动重新格式化大括号?_Formatting_Vim - Fatal编程技术网

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

Formatting 有没有办法用Vim自动重新格式化大括号?,formatting,vim,Formatting,Vim,我想重新格式化一些代码,如下所示: if (cond) { foo; } 到 因为这是C代码,所以我一直在研究cindent/cinoptions以与=一起使用,但它似乎不处理多行规则 我一直在研究formatoptions与gq一起使用,但似乎也不可能 那么,是否可以使用默认的Vim选项,或者我应该使用特定的插件或函数?我不知道这是否完全解决了您的问题,但如果这是一次性操作,您可能希望尝试正则表达式: :%s/^\(\s*\)\(.*)\)\s*{\s*$/\1\2^M\1{/ 请注意

我想重新格式化一些代码,如下所示:

if (cond) {
  foo;
}

因为这是C代码,所以我一直在研究
cindent
/
cinoptions
以与
=
一起使用,但它似乎不处理多行规则

我一直在研究
formatoptions
gq
一起使用,但似乎也不可能


那么,是否可以使用默认的Vim选项,或者我应该使用特定的插件或函数?

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

:%s/^\(\s*\)\(.*)\)\s*{\s*$/\1\2^M\1{/
请注意,
^M
是一个控制字符,通常通过按CTRL-V和ENTER键生成(取决于您的终端)


EDIT:正如Jay和Zyx在评论中指出的那样,
\r
是在替换的字符串中插入换行符的更好方法。我没有意识到这一点,非常感谢您的提示。

我不知道您是否可以在vim本身中执行此操作,但是您可以使用
-bl
选项尝试BSD
indent
命令。光标位于第一个
{
,您可以键入!%%
indent-bl
Enter

细分:

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

*
=其他所有内容

\zs
=在此之后开始更换

{
=开放式花括号

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

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

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

:set formatprg=astyle\ -b
然后使用重新格式化代码块。强调文本

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

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

为什么要使用
^M
?那
\r
呢?它确实有效,但如果可以通过现有选项访问它,我会更愿意。我仍然可以在映射到+某物的用户定义函数中使用您的regexp。如果没有其他解决方案,我将接受您的答案。无论如何,感谢您的输入!@Jay:因为这对所有ma都不起作用我正在研究中文,但如果你只研究MacOS,这是一个很好的选择。@soulmerge。你错了:出于历史原因,
\r
在替换中意味着“此时将线一分为二”,而不是
\x0D
,如果你不相信我,请参阅
:hs/\r
。@Zyx:谢谢你的信息,我不知道。没有必要这么咄咄逼人,尽管如此。@Jay:不知道
\r
转换为本机换行符我建议用
文件类型c
替换
BufNewFile,BufRead*.c
。或者甚至将其放入
~/.vim/ftplugin/c.vim
。这很好,但是为什么
ftplugin
after/ftplugin
:set formatprg=astyle\ -b
autocmd BufNewFile,BufRead *.c set formatprg=astyle\ -b