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

Lesezeit: 4 Minuten

Benutzeravatar von Yongwei Xing
Yongwei Xing

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?

  • Für alle, die den Code formatieren und nicht nur einrücken möchten, geht die zweite Antwort (meine) darauf ein. Wenn Sie nur die Einrückung korrigieren möchten, ist die akzeptierte Antwort der einfachste Weg.

    – Derek

    2. April 2015 um 21:07 Uhr

Benutzeravatar von Amir Rachum
Amir Rachum

Probieren Sie die folgenden Tastenkombinationen aus:

gg=G

Erläuterung: gg geht an den Anfang der Datei, = ist ein Befehl zum Korrigieren der Einrückung und G weist es an, die Operation bis zum Ende der Datei auszuführen.

  • Dadurch wird der Code nur eingerückt. kann man nicht irgendetwas tun, um das ganze zu AUTOFORMATIEREN?

    – Nein 1.1

    1. März 2010 um 12:54 Uhr

  • @Ton van: Siehe meine Antwort für den Unterschied (hätte hier in Kommentaren nicht erklärt werden können).

    – Laser

    21. November 2010 um 7:47 Uhr

  • -1 Dies behebt nur die Einrückung, nicht die Formatierung (wonach gefragt wurde).

    – Oligofren

    19. April 2013 um 6:58 Uhr

  • @oligofren Das Beispiel des OP enthielt nur Einrückungsfehler und er akzeptiert die Antwort, also denke ich, dass er das gemeint hat.

    – Amir Rachum

    19. April 2013 um 17:40 Uhr

  • @oligofren Außerdem hat er angegeben, dass er den Code aus einer anderen Datei kopiert, was Einrückungsprobleme wahrscheinlicher macht als andere Formatierungsprobleme.

    – Amir Rachum

    19. April 2013 um 17:42 Uhr

Dereks Benutzeravatar
Derek

Ich verwende gerne das Programm Artistic Style. Nach Ihnen Webseite:

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) zu wenn ( x<2 ) wenn es Ihnen gefällt), Klammern in derselben Zeile wie Funktionsdefinitionen platzieren oder sie in die Zeile darunter verschieben usw. Alle Optionen werden durch 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 also eine .cpp-Datei öffne, wird formatprg mit den Optionen eingestellt, die ich mag. Dann kann ich gg eingeben, um zum Anfang der Datei zu gehen, und gqG um die gesamte Datei nach meinen Standards zu formatieren. Wenn ich nur eine einzelne Funktion neu formatieren muss, kann ich zum Anfang der Funktion gehen und dann tippen gq][ and it will reformat just that function.

The options I have for astyle, -T4pb, are just my preferences. You can look through their docs, and change the options to have it format the code however you like.

Here’s a demo. Before astyle:

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

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

After astyle (gggqG):

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

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

Hope that helps.

  • Is there anything like this for other formats; ruby, xml, json, etc.?

    – derGral

    Jun 17, 2011 at 19:22

  • @Ryan check vim-autoformat, see answer below. BTW vim-autoformat also uses astyle among others.

    – chtenb

    Apr 14, 2013 at 20:13


  • Thank you! I was beginning to think I was the only person in the word who didn’t want their opening brackets on the same line as the function declaration!

    – user3640967

    Feb 2, 2016 at 9:59

The builtin command for properly indenting the code has already been mentioned (gg=G). If you want to beautify the code, you’ll need to use an external application like indent. Since % denotes the current file in ex mode, you can use it like this:

:!indent %

  • Before using this command, ensure to do sudo apt install indent to install the indent utility.

    – Roel Van de Paar

    Jun 16 at 23:02

I find that clang-format works well.

There are some example keybindings in the clang documentation

I prefer to use the equalprg binding in vim. This allows you to invoke clang-format with G=gg or other = indent options.

Just put the following in your .vimrc file:

autocmd FileType c,cpp setlocal equalprg=clang-format

chtenb's user avatar
chtenb

The plugin vim-autoformat lets you format your buffer (or buffer selections) with a single command: https://github.com/vim-autoformat/vim-autoformat. It uses external format programs for that, with a fallback to vim’s indentation functionality.

dsummersl's user avatar
dsummersl

I like indent as mentioned above, but most often I want to format only a small section of the file that I’m working on. Since indent can take code from stdin, its really simple:

  1. Select the block of code you want to format with V or the like.
  2. Format by typing :!indent.

astyle takes stdin too, so you can use the same trick there.

atripes's user avatar
atripes

I wanted to add, that in order to prevent it from being messed up in the first place you can type :set paste before pasting. After pasting, you can type :set nopaste for things like js-beautify and indenting to work again.

  • I use :set paste! for this, which toggles the paste value instead of setting it. This makes it easier to turn off as you can simply scroll back a few commands and press enter.

    – a’r

    May 2, 2020 at 9:05

  • You can also setup a hotkey for this. I wish I didn’t have to but it’s apparently a necessary evil.

    – qwr

    Jul 31 at 5:34

1426640cookie-checkWie kann ich C-Code in vim automatisch formatieren/einrücken?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy