Wie kann ich C-Code in vim automatisch formatieren / einrücken?

250

Wenn ich Code aus einer anderen Datei kopiere, wird die Formatierung wie folgt durcheinander gebracht:

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}

Wie kann ich diesen Code in vim automatisch formatieren?

Yongwei Xing
quelle
3
Für alle, die den Code formatieren und nicht nur einrücken möchten, wird dies in der zweiten Antwort (meiner) angesprochen. Wenn Sie nur das Einrücken korrigieren möchten, ist die akzeptierte Antwort der einfachste Weg.
Derek

Antworten:

566

Versuchen Sie die folgenden Tastenanschläge:

gg=G

Erläuterung: ggGeht an den Anfang der Datei, =ist ein Befehl zum Korrigieren des Einrückens und Gweist ihn an, den Vorgang bis zum Ende der Datei auszuführen.

Amir Rachum
quelle
28
Dadurch wird nur der Code eingerückt. Kann nicht etwas getan werden, um das Ganze zu AUTOFORMIEREN?
N 1.1
7
Was ist der Unterschied?
Ton van den Heuvel
3
@ Ton van: Siehe meine Antwort für den Unterschied (hätte hier in Kommentaren nicht erklärt werden können).
Lazer
2
-1 Dies behebt nur Einrückungen, nicht Formatierungen (was verlangt wurde).
Oligofren
3
@oligofren Das Beispiel des OP enthielt nur Einrückungsfehler und er akzeptiert die Antwort. Ich denke, das hat er gemeint.
Amir Rachum
78

Ich benutze gerne das Programm Artistic Style. Laut ihrer Website :

Artistic Style ist ein Quellcode-Indenter, Formatierer und Verschönerer für die Programmiersprachen C, C ++, C # und Java.

Es läuft unter Windows, Linux und Mac. Es wird Dinge wie Einrücken, Ersetzen von Tabulatoren durch Leerzeichen oder umgekehrt, Platzieren von Leerzeichen um Operationen, wie Sie möchten (Konvertieren if(x<2)in, wenn ( x<2 )es Ihnen gefällt), Klammern in derselben Zeile wie Funktionsdefinitionen oder Verschieben in die Zeile unten usw. Alle Optionen werden über Befehlszeilenparameter gesteuert.

Um es in vim zu verwenden, setzen Sie einfach die Option formatprg darauf und verwenden Sie dann den Befehl gq. So habe ich zum Beispiel in meiner .vimrc:

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb

Wenn ich eine CPP-Datei öffne, wird formatprg mit den gewünschten Optionen festgelegt. Dann kann ich gg eingeben, um an den Anfang der Datei zu gelangen und gqGdie gesamte Datei gemäß meinen Standards zu formatieren. Wenn ich nur eine einzelne Funktion neu formatieren muss, kann ich zum Anfang der Funktion gehen, dann tippen gq][und es wird nur diese Funktion neu formatieren.

Die Optionen, die ich für Astyle habe -T4pb, sind nur meine Vorlieben. Sie können die Dokumente durchsehen und die Optionen ändern, damit der Code nach Ihren Wünschen formatiert wird.

Hier ist eine Demo. Vor dem Astyle:

int main(){if(x<2){x=3;}}

float test()
{
if(x<2)
x=3;
}

Nach Astyle (gggqG):

int main()
{
    if (x < 2)
    {
        x = 3;
    }
}

float test()
{
    if (x < 2)
        x = 3;
}

Hoffentlich hilft das.

Derek
quelle
3
Gibt es so etwas für andere Formate? Ruby, XML, JSON usw.?
derGral
1
@ Ryan check vim-autoformat, siehe Antwort unten. Übrigens verwendet vim-autoformat unter anderem auch Astyle.
Chiel zehn Brinke
1
Danke dir! Ich begann zu glauben, ich sei die einzige Person im Wort, die nicht wollte, dass ihre öffnenden Klammern in derselben Zeile wie die Funktionsdeklaration stehen!
user3640967
27

Der eingebaute Befehl zum korrekten Einrücken des Codes wurde bereits erwähnt ( gg=G). Wenn Sie den Code verschönern möchten , müssen Sie eine externe Anwendung wie Einzug verwenden . Da %die aktuelle Datei im Ex-Modus bezeichnet wird, können Sie sie folgendermaßen verwenden:

:!indent %
Soulmerge
quelle
13

Mit dem Plugin vim-autoformat können Sie Ihren Puffer (oder Ihre Pufferauswahl) mit einem einzigen Befehl formatieren: https://github.com/Chiel92/vim-autoformat . Dafür werden externe Formatprogramme verwendet, wobei auf die Einrückungsfunktionalität von vim zurückgegriffen wird.

Chiel ten Brinke
quelle
11

Ich finde das clang-formatfunktioniert gut.

In der Clang-Dokumentation finden Sie einige Beispiel-Tastenkombinationen

Ich bevorzuge die equalprgBindung in vim. Auf diese Weise können Sie clang-formatmit G=ggoder anderen =Einrückungsoptionen aufrufen .

Fügen Sie einfach Folgendes in Ihre .vimrc-Datei ein:

autocmd FileType c,cpp setlocal equalprg=clang-format
Daniel
quelle
3
Müssen Sie es zuerst installieren, zB für Ubuntu 16.04+:sudo apt install clang-format
Eric Wang
3

Vielleicht können Sie die folgenden $ indent -kr -i8 * .c versuchen

Hoffe es ist nützlich für dich!

Lattimore
quelle
3

Ich mag indentwie oben erwähnt, aber meistens möchte ich nur einen kleinen Abschnitt der Datei formatieren, an der ich arbeite. Da indentkann Code von stdin nehmen, ist es wirklich einfach:

  1. Wählen Sie den Codeblock aus, mit dem Sie formatieren möchten, Voder dergleichen.
  2. Formatieren Sie durch Eingabe :!indent.

astyle nimmt auch stdin, so dass Sie dort den gleichen Trick anwenden können.

dsummersl
quelle
2

Ich wollte hinzufügen, dass Sie :set pastevor dem Einfügen tippen können, um zu verhindern, dass es an erster Stelle durcheinander kommt . Nach dem Einfügen können Sie :set nopasteeingeben, dass Dinge wie js-Verschönern und Einrücken wieder funktionieren.

atripes
quelle
1
Ich benutze :set paste!dafür, was den Einfügewert umschaltet, anstatt ihn einzustellen. Dies erleichtert das Ausschalten, da Sie einfach einige Befehle zurückblättern und die Eingabetaste drücken können.
Am
0

Ihr ist ein Werkzeug namens indent. Sie können es mit herunterladen apt-get install indentund dann ausführen indent my_program.c.

n0va_sa
quelle