it-swarm.com.de

Ist es möglich, C++ - Code mit VIM zu formatieren?

Ich bin ziemlich neu bei VIM. Ich habe einen Quellcode und das ist ein Durcheinander. Auf den ersten Blick möchte ich zumindest eine klare und übersichtliche Sicht auf den Code haben, damit ich ihn richtig formatieren kann, ich meine eingerückt, abhängig von der Tiefe der Funktionen und so.

Ich frage mich, ob es mit VIM möglich ist und welche anderen Kommandozeilen-Tools Sie sonst empfehlen können.

Vielen Dank

31
flow

Während vim ein echtes Schweizer Messer ist, ziehe ich für einige Jobs immer noch externe Werkzeuge vor. Dieser Ansatz ist manchmal viel intuitiver und einfacher zu merken als das integrierte Äquivalent.

Beim Einrücken filtere ich den gesamten Dateipuffer durch astyle. Die Astyle-Parameter sind in wenigen Minuten viel einfacher zu erfassen, insbesondere wenn Sie kein Vim-Guru sind. Außerdem bietet astyle viel mehr Flexibilität bei der Feinabstimmung der Ausgabe.

Installieren Sie zuerst Astyle:
# apt-get install astyle

Dann in vim:
:%!astyle (einfacher Fall - der Standardmodus für Cyle ist C/C++)
oder
:%!astyle --mode=c --style=ansi -s2 (im C++ - Stil von ansi werden zwei Leerzeichen pro Einzugsebene verwendet)
oder
:1,40!astyle --mode=c --style=ansi (ansi C++ - Format, nur Zeilen 1-40 filtern) 

59
m000

sie können folgendes tun:

gg=G
27
codaddict

Ich würde das Clang-Format heutzutage wärmstens empfehlen. Es ermöglicht die einfache Integration des Clang-Formats in Vim, sobald Sie das Clang-Format installiert haben:

http://clang.llvm.org/docs/ClangFormat.html#vim-integration

Es ist der einzige Code-Beautifier, der Ihren C++ - Code wirklich versteht, und es ist wirklich intelligent, den Code eher wie ein Mensch als eine Maschine zu verschönern. Z.B.:

void TestFunction(int argument1, int argument2,
                  int argument3);
void TestFunctionVeryLongName(int argument1,
                              int argument2,
                              int argument3);
void TestFunctionWithRidiculouslyLongName(
    int argument1, int argument2, int argument3);
13
Yongwei Wu

Es gibt ein vim-Plugin, das die Formatierung Ihres Codes von vim aus ermöglicht. Es heißt vim-autoformat und kann hier heruntergeladen werden:

https://github.com/Chiel92/vim-autoformat

Es integriert externe Code-Formatierungsprogramme in vim. Wenn Sie zum Beispiel C, C++, C # oder Java code formatieren möchten, müssen Sie das Programm astyle installieren und vim legt es automatisch als Formatierungsprogramm fest.

4

Vim wird dies definitiv tun, auch wenn die Ergebnisse möglicherweise nicht perfekt sind:

  1. Wählen Sie zunächst die gesamte Datei im visuellen Modus aus: ggVG
  2. Klicken Sie dann auf =, um alles erneut anzuzeigen.

Sie können mehr über den Gleichheitsbefehl lernen mit: :help =

4
Mike Mueller

Es gibt auch ein Vim-Plugin, das auf clang-format : vim-clang-format basiert.

Dann können Sie den Formatierungsbefehl ganz einfach Ihren Wünschen zuordnen.

4
BenC

Ich schreibe keinen C++ - Code, aber ich schreibe Java-Code.

Stattdessen unterstützt Vim die Formatierung einiger gängiger Sprachen. Ich habe eine Abkürzung eingerichtet, um den gesamten Code im Puffer zu formatieren. Er kehrt zu der gerade bearbeiteten Zeile zurück :)

" format the file
map <leader>fm gg=G'. 
2
code4j

Eine generische Lösung im Sinne von m000 ist die Verwendung von UniversalIndentGUI als externes Werkzeug.

1
Mike Summers

Ich musste nur genau dieses Problem lösen, also dachte ich, ich würde dazu beitragen, andere Zeit zu sparen.

Sie können gg=G verwenden, um Ihren Code einzuziehen. Die Dinge werden jedoch schwer zu verstehen, sobald Sie möchten, wie das automatische Einrücken geschieht. Wenn Sie nur darauf achten, dass fehlerhafte Leerzeichen entfernt werden und der Formatierungsstil nicht wirklich wichtig ist, ist gg=G der schnellste Weg, dies zu tun, da er eingebettet ist.

Wenn Sie den Stil steuern möchten (z. B. versuchen Sie, Ihren Code an einen Styleguide anzupassen), benötigen Sie ein externes Werkzeug zur Verarbeitung Ihrer Datei. Sie können dieses Tool von vim aus aufrufen: :%!<toolname> <options>. Dadurch wird die Datei durch das Werkzeug geleitet und das verarbeitete Ergebnis erneut geladen. (Sie können dies natürlich auch für andere Zwecke verwenden, die Sie für Ihre Datei tun möchten.)

Die nächste Frage ist also, welches externe Werkzeug Sie wählen sollten. Unabhängig davon ist die Methode die gleiche:

  1. Installieren Sie das gewünschte Werkzeug
  2. Stellen Sie sicher, dass es auf Ihrem Weg ist
  3. Fügen Sie Ihrer vimrc-Datei eine Zeile hinzu, die eine Tastenkombination erstellt, um Zeit zu sparen
  4. Benutze es.

Welches Werkzeug Sie verwenden, hängt nun von dem Stil ab, den Sie zu replizieren versuchen. Wenn Sie versuchen, einen weit verbreiteten Stil zu replizieren, sind die Chancen astyle alles, was Sie brauchen. 

Wenn Sie versuchen, einen benutzerdefinierten Stil zu replizieren, benötigen Sie zwei Dinge:

  1. UniversalIndentGui - ein Frontend, mit dem Sie mit verschiedenen Optionen herumspielen können und deren Auswirkungen auf die Quelldatei live in der Vorschau sehen können
  2. Eine Reihe von Quellcode-Formatierungstools installiert und in Ihrem Pfad

Zwischen uncrustify und greatcode sollten Sie in der Lage sein, den gewünschten Stil vollständig zu replizieren.

Eigentlich habe ich gelogen. Es gibt einen anderen Weg und das genannte clang-format . Sie sollten jedoch die Dokumentation darüber lesen, und es ist noch in einem frühen Stadium, so dass einige Optionen nicht sehr gut funktionieren. Es ist jedoch ein wunderschönes Tool (definitiv das intelligenteste von allen, weil es einen AST Ihres Codes erstellt) und es ist sogar für Windows verfügbar. 

Wenn Sie sich die Zeit nehmen, um das Handbuch zu lesen, sollten Sie auch GNU Indent auschecken.

Natürlich gibt es den letzten Weg, der tatsächlich die Zeit in Anspruch nimmt, um die Einrückungsregeln von vim zu lernen und eine für Ihren Stil zu schreiben. Es wird einige Zeit dauern, aber es funktioniert mit gg=G.

Einige Anmerkungen zu Astyle vs uncrustify vs greatcode:

  1. Astyle eignet sich gut für die allgemeine Formatierung, kann jedoch nicht die Deklaration von Variablen ausrichten und Kommentare sehr gut umgestalten.
  2. Uncrustify kann eine Menge Sachen, die Astyle nicht kann, aber Sie müssen eine Stunde lang herumspielen, bis Sie die richtige Kombination von Optionen gefunden haben, die Sie benötigen. (Oder wenn Sie Lust haben, viel Zeit zu verschwenden, verwenden Sie genetische Algorithmen, um die beste Kombination von Optionen für Ihren Stil zu ermitteln und wenn Sie den Code freigeben, und geben Sie mir einen Link, damit ich ihn auch verwenden kann :))

Beachten Sie, dass Sie kein Werkzeug auswählen müssen. Mit vim können Sie einen Tastendruck zuordnen, um mehrere Befehle nacheinander auszuführen. Sie können also theoretisch eine Kombination dieser Tools verwenden, um genau das zu erhalten, wonach Sie suchen.

Zu guter Letzt hier ein Auszug aus meiner .vimrc-Datei, in der ich F12 zugeordnet habe, um astyle mit einigen Optionen aufzurufen:

"A2 = attached brackets
"-s8 indent 8 spaces
"-xc attached braces to class declarations
"-xj remove braces for single statement ifs and elses
"-c convert tabs to spaces in the non-indentation part of the line
map <F12> :%!astyle -A2 -s8 -xc -xj -c<CR>

Verurteilen Sie mich nicht nach dem Stil. Verwenden Sie einfach das Tool, um zu reproduzieren, was Sie möchten.

0
Carl