如何告诉 VIM 在新行上格式化函数、条件和循环的括号?

如何告诉 VIM 在新行上格式化函数、条件和循环的括号?

有没有办法让 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{,如果“}”前面有两个空格或制表符,则不会替换末尾带有“}”的行,这表明它可能正确缩进。

相关内容