関数、条件、ループの括弧を新しい行にフォーマットするように 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なぜそうなるのでしょうか? 2 番目の例のようにフォーマットされている場合、VIM を押すとコード ブロックがきれいに折りたたまれるためです。 この場合、VIM は括弧内のコンテンツのみを折りたたみます。コードが最初の例のようにフォーマットされている場合、VIM は括弧内のコンテンツだけでなくif (...)、、、、for (....)なども折りたたみます。そこで、2 番目の例のようにファイルをフォーマットするように VIM に指示する方法があるかどうかを知りたいです。function f()class Foo()

別の方法としては、括弧の前の内容を折り返さないように VIM に指示する方法があります。

答え1

はい、それは非常に簡単にできます。行末の既存の '{' 文字 ( $) を復帰 ( \r) と新しい '{' に置き換えて、適切にフォーマットするには、次の 2 つのコマンドを実行します (ただし、エッジケースについては回答の最後にある編集を参照してください)。

:%s/{$/\r{

:%norm ==

最初のコマンドは次のようになります:

public class Foo 
{
    private Foo(int a) 
{
        if (a > 30) 
{
            // do stuff
        }
        for (int i = 0; i < a; i++) 
{
            // more stuff
        }
    }
}

2 番目のコマンドは次のようになります。

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{'}' の前に 2 つのスペースまたはタブがある場合、末尾の '}' のある行は置き換えられません。これは、'}' が正しくインデントされていることを示しています。

関連情報