wie kann man VIM anweisen, Klammern von Funktionen, Bedingungen und Schleifen in einer neuen Zeile zu formatieren?

wie kann man VIM anweisen, Klammern von Funktionen, Bedingungen und Schleifen in einer neuen Zeile zu formatieren?

Gibt es eine Möglichkeit, vim anzuweisen, Klammern in einer neuen Zeile zu formatieren?

Zum Beispiel:

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

Soll werden:

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

Warum das? Weil zcVIM durch Drücken von Codeblöcke ordentlich zusammenfaltet, wenn sie wie im zweiten Beispiel formatiert sind. In diesem Fall wird VIM nur den Inhalt innerhalb der Klammern zusammenfalten. Wenn Code wie im ersten Beispiel formatiert ist, wird VIM nicht nur den Inhalt innerhalb der Klammern zusammenfalten, sondern auch if (...), for (....), function f(), class Foo(), usw. zusammenfalten. Daher würde ich gerne wissen, ob es eine Möglichkeit gibt, VIM anzuweisen, die Datei wie im zweiten Beispiel zu formatieren.

Eine andere Alternative wäre, VIM anzuweisen, den Inhalt vor den Klammern nicht zusammenzufalten.

Antwort1

Ja, das ist ganz einfach möglich: Um die vorhandenen „{“-Zeichen am Zeilenende ( $) durch einen Wagenrücklauf ( \r) und ein neues „{“ zu ersetzen und das Ganze dann ordentlich zu formatieren, können Sie die folgenden beiden Befehle ausführen (siehe jedoch für einen Sonderfall die Bearbeitung am Ende der Antwort):

:%s/{$/\r{

:%norm ==

Der erste Befehl führt zu folgendem Ergebnis:

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

Der zweite Befehl führt zu folgendem Ergebnis:

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

(Das %Zeichen in den obigen Befehlen bedeutet, dass es auf alle Zeilen der Datei angewendet wird. Sie können stattdessen auch einen Bereich wie angeben :5,10s/{$/\r{oder relative Zeilennummern wie verwenden -2,+3s/{$/\r{oder die Zeilen im visuellen Modus auswählen und drücken. : Der Ersetzungsbefehl wird dann auf diese Zeilen angewendet.)

(Sie können die Formatierung auch mit „Absatz formatieren“ anwenden =ap, a pEinzelheiten finden Sie :help =unter)

Bearbeiten

Aus dem Kommentar von @blackyellow: Es ist eine gute Lösung, aber ein Problem ist, dass es auch die Zeilen mit '}' ersetzt, die bereits korrekt formatiert sind. Ein besseres Muster ist :%s/[^( |\t)]}$/\r{, das Zeilen am Ende nicht mit '}' ersetzt, wenn dem '}' zwei Leerzeichen oder ein Tabulator vorangehen, was darauf hinweist, dass es wahrscheinlich korrekt eingerückt ist.

verwandte Informationen