开发者

Is there a way to reformat braces automatically with Vim?

I would like to reformat some code which looks like this :

if (cond) {
  foo;
}

to

if (cond)
{
  foo;
} 

Since this is C code, I have been looking at cindent/ci开发者_运维问答noptions to use with = but it seems it does not deal with multiline rules.

I have been looking at formatoptionsto use with gq, and it does not seem to be possible either.

So is it possible using default Vim options or should I use a specific plugin or function ?


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

Breakdown:

^\(\s*\) = capture the whitespace at the beginning of the line

.* = everything else

\zs = start replacement after this

{ = open curly brace

\s*$ = trailing whitespace before line end

\r\1{ = newline, captured whitespace, brace


I don't know if this completely solves your problem, but if this is a one-shot operation, you might want to try regular expressions:

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

Note that ^M is a control character that is usually generated (depending on your terminal) by pressing CTRL-V followed by ENTER.

EDIT: As pointed out in the comments by Jay and Zyx, \r is a better way of inserting a line break into the replaced string. I wasn't aware of that, many thanks for the hint.


If you install Artistic Style you can do something like:

:set formatprg=astyle\ -b

Then use gq to reformat chunks of code.emphasized text

If you want this enabled every time you edit a C file, you can add the following to your .vimrc file.

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


I don't know if you can do it within vim itself, but you can try the BSD indent command with the -bl option. With the cursor on the first {, you can type !%indent -blEnter.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜