Come posso formattare automaticamente / indentare il codice C in vim?


250

Quando copio il codice da un altro file, la formattazione è incasinata, in questo modo:

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

Come posso formattare automaticamente questo codice in vim?


3
Per chiunque cerchi di formattare e non solo indentare il codice, la seconda risposta (la mia) è indirizzata a questo. Se vuoi solo correggere il rientro, la risposta accettata è il modo più semplice.
Derek,

Risposte:


566

Prova le seguenti sequenze di tasti:

gg=G

Spiegazione: ggva all'inizio del file, =è un comando per correggere il rientro e gli Gdice di eseguire l'operazione fino alla fine del file.


28
questo rientra solo nel codice. qualcosa non può essere fatto per AUTOFORMARE l'intera cosa?
N 1.1

7
Qual è la differenza?
Ton van den Heuvel

3
@Ton van: vedi la mia risposta per la differenza (non avrei potuto spiegare qui nei commenti).
Lazer,

2
-1 Questo risolve solo il rientro, non la formattazione (che era ciò che veniva richiesto).
Oligofren,

3
@oligofren L'esempio del PO includeva solo errori di rientro e lui accetta la risposta, quindi immagino che intendesse questo.
Amir Rachum,

78

Mi piace usare il programma Artistic Style. Secondo il loro sito Web :

Lo stile artistico è un indentatore di codice sorgente, formattatore ed estetista per i linguaggi di programmazione C, C ++, C # e Java.

Funziona su Windows, Linux e Mac. Farà cose come il rientro, la sostituzione di schede con spazi o viceversa, mettendo gli spazi attorno alle operazioni come preferisci (convertendole if(x<2)in se ( x<2 )è così che ti piace), mettendo parentesi graffe sulla stessa linea delle definizioni delle funzioni o spostandole nella riga in basso, ecc. Tutte le opzioni sono controllate dai parametri della riga di comando.

Per usarlo in vim, basta impostare l'opzione formatprg su di esso, quindi usare il comando gq. Quindi, per esempio, ho nel mio .vimrc:

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

così ogni volta che apro un file .cpp, formatprg viene impostato con le opzioni che mi piacciono. Quindi, posso digitare gg per andare all'inizio del file e gqGper formattare l'intero file secondo i miei standard. Se ho solo bisogno di riformattare una singola funzione, posso andare all'inizio della funzione, quindi digitare gq][e riformatterà solo quella funzione.

Le opzioni che ho per astyle -T4pbsono solo le mie preferenze. Puoi consultare i loro documenti e modificare le opzioni per formattarlo nel modo che preferisci.

Ecco una demo. Prima di astyle:

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

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

Dopo astyle (gggqG):

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

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

Spero che aiuti.


3
C'è qualcosa del genere per altri formati; rubino, xml, json, ecc.?
derGral,

1
@Ryan check vim-autoformat, vedi risposta sotto. BTW vim-autoformat usa anche astyle tra gli altri.
Chiel ten Brinke,

1
Grazie! Stavo iniziando a pensare di essere l'unica persona della parola che non voleva che le loro parentesi di apertura fossero sulla stessa riga della dichiarazione di funzione!
user3640967

27

Il comando incorporato per indentare correttamente il codice è già stato menzionato ( gg=G). Se vuoi abbellire il codice, dovrai usare un'applicazione esterna come indent . Poiché %indica il file corrente in modalità ex, è possibile utilizzarlo in questo modo:

:!indent %


11

Trovo che clang-formatfunzioni bene.

Ci sono alcune combinazioni di tasti di esempio nella documentazione di clang

Preferisco usare l' equalprgassociazione in vim. Ciò consente di invocare clang-formatcon G=ggo altre =opzioni di rientro.

Inserisci quanto segue nel tuo file .vimrc:

autocmd FileType c,cpp setlocal equalprg=clang-format

3
È necessario installarlo prima, ad esempio per Ubuntu 16.04+:sudo apt install clang-format
Eric Wang

3

Forse puoi provare i seguenti $ indent -kr -i8 * .c

Spero sia utile per te!


3

Mi piace indentcome menzionato sopra, ma molto spesso voglio formattare solo una piccola sezione del file su cui sto lavorando. Dal momento che indentpuò prendere il codice da stdin, è davvero semplice:

  1. Seleziona il blocco di codice con cui vuoi formattare Vo simili.
  2. Formatta digitando :!indent.

astyle prende anche lo stdin, quindi puoi usare lo stesso trucco lì.


2

Volevo aggiungere che per evitare che si incasinasse in primo luogo è possibile digitare :set pasteprima di incollare. Dopo aver incollato, puoi digitare :set nopastecose come js-beautify e rientrare per funzionare di nuovo.


1
Uso :set paste!questo, che attiva o disattiva il valore incolla. Ciò semplifica lo spegnimento poiché puoi semplicemente scorrere indietro di alcuni comandi e premere Invio.
a'r

0

Il loro è uno strumento chiamato indent. Puoi scaricarlo con apt-get install indent, quindi eseguire indent my_program.c.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.