有没有办法让 vim 在新行上格式化括号?
例如:
public class Foo {
private Foo(int a) {
if (a > 30) {
// do stuff
}
for (int i = 0; i < a; i++) {
// more stuff
}
}
}
应该变成:
public class Foo
{
private Foo(int a)
{
if (a > 30)
{
// do stuff
}
for (int i = 0; i < a; i++)
{
// more stuff
}
}
}
为什么这个?因为zc
如果代码块的格式如第二个示例所示,则按VIM 可以很好地折叠代码块。在这种情况下,VIM 将只折叠括号内的内容。如果代码的格式如第一个示例所示,VIM 不仅会折叠括号内的内容,还会折叠if (...)
、for (....)
、function f()
、
class Foo()
等。所以我想知道是否有办法告诉 VIM 像第二个例子一样格式化文件。
另一种选择是告诉 VIM 不要折叠括号之前的内容。
答案1
$
是的,您可以很容易地做到这一点:用回车符()和新的“ {”替换行()末尾的现有“{”字符\r
,然后很好地格式化内容,您可以执行以下两个命令(尽管请参阅答案末尾的编辑以了解边缘情况):
:%s/{$/\r{
:%norm ==
第一个命令将达到以下目的:
public class Foo
{
private Foo(int a)
{
if (a > 30)
{
// do stuff
}
for (int i = 0; i < a; i++)
{
// more stuff
}
}
}
第二个命令将达到此目的:
public class Foo
{
private Foo(int a)
{
if (a > 30)
{
// do stuff
}
for (int i = 0; i < a; i++)
{
// more stuff
}
}
}
(%
上述命令中的符号表示适用于文件的所有行。您可以改为给出一个范围,如:5,10s/{$/\r{
,或者您可以使用相对行号,如-2,+3s/{$/\r{
,或在可视模式下选择行并点击:
,替换命令将应用于这些行线)。
(您还可以应用格式来=ap
格式化a
p
段落,请参阅
:help =
详细信息)
编辑
来自@blackyellow的评论:这是一个很好的解决方案,但一个问题是它还用“}”替换了已经正确格式化的行。更好的模式是:%s/[^( |\t)]}$/\r{
,如果“}”前面有两个空格或制表符,则不会替换末尾带有“}”的行,这表明它可能正确缩进。