2010-03-01 25 views
193

Quando copiare il codice da un altro file, la formattazione è incasinato, come questo:Come posso formattare/indentare il codice C in vim?

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

Come posso formattazione automatica questo codice in vim?

+2

Per chi cerca di formattare e non solo il rientro del codice, la seconda risposta (la mia) lo indirizza. Se vuoi solo correggere il rientro, la risposta accettata è il modo più semplice. – Derek

risposta

443

provare le seguenti combinazioni di tasti:

gg=G 

Spiegazione: gg va alla parte superiore del file, = è un comando per fissare il rientro e G dice di eseguire l'operazione fino alla fine del file.

+18

questo fa rientrare solo il codice. può qualcosa non essere fatto per AUTOFORMAT l'intera cosa? –

+7

Qual è la differenza? –

+4

Mi piace questo comando, semplice e utile. Grazie –

24

Il comando incorporato per il rientro corretto del codice è già stato menzionato (gg=G). Se si desidera abbellire il codice, sarà necessario utilizzare un'applicazione esterna come indent. Dal momento che % indica il file corrente in modalità ex, è possibile utilizzarlo in questo modo:

:!indent % 
73

Mi piace usare il programma Stile artistico. Secondo la loro website:

stile artistico è un codice sorgente di penetratore, formattatore, e beautifier per la C, C++, C# e linguaggi di programmazione Java.

Funziona in Windows, Linux e Mac. Farà cose come l'indentazione, la sostituzione di tabulazioni con spazi o viceversa, inserendo gli spazi attorno alle operazioni come preferisci (convertendo se è così che ti piace), mettendo le parentesi sulla stessa riga delle definizioni di funzione o spostandole alla riga sottostante, ecc. Tutte le opzioni sono controllate dai parametri della riga di comando.

Per utilizzarlo in vim, è sufficiente impostare l'opzione formatprg su di esso e quindi utilizzare il comando gq. Così, per esempio, ho nel mio Vimrc:

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

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

Le opzioni disponibili per astyle, -T4pb, sono solo le mie preferenze. Puoi guardare attraverso their docs e cambiare le opzioni per farlo formattare il codice come preferisci.

Ecco una demo. Prima 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; 
} 

Speranza che aiuta.

+2

Esiste qualcosa come questo per altri formati; rubino, xml, json, ecc.? – derGral

+0

Grazie per il suggerimento Artistico! – pjvds

+1

@Ryan controlla vim-autoformat, vedi risposta sotto. BTW vim-autoformat usa anche astyle, tra gli altri. –

51

Il PO ha chiesto per auto-formattazione, ma ha accettato una risposta che fa auto-indentazione solo.

Ecco la differenza:

ORIGINALE

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

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

autoindent

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

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

Formattazione automatica

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

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

Ah, capisco. Ora rimane la domanda su come automatizzare effettivamente :) –

+34

-1 Questo è un commento, non una risposta. È necessario fornire qualcosa che in realtà compia l'autoformattazione, non solo mostrare di cosa si tratta. – oligofren

+29

In questa particolare circostanza non vedo come avrebbe potuto rendere il suo punto di vista diverso pubblicando una risposta? – expelledboy

2

Forse si può provare le seguenti $ trattino -kr -i8 * .c

Spero che è utile per voi!

12

Il plugin vim-formattazione automatica consente di formattare il buffer con un solo pulsante: https://github.com/Chiel92/vim-autoformat. Utilizza programmi di formattazione esterni per questo, con un fallback della funzionalità di indentazione di vim.

3

Mi piace indent come accennato in precedenza, ma più spesso desidero formattare solo una piccola sezione del file su cui sto lavorando. Dal momento che indent può prendere il codice da stdin, la sua davvero semplice:

  1. Selezionare il blocco di codice che si desidera formattare con V o simili.
  2. Formato digitando :!indent.

astyle prende lo stdin, quindi è possibile utilizzare lo stesso trucco lì.

5

trovo che clang-format funziona bene.

ci sono alcuni esempi di combinazioni di tasti nella clang documentation

preferisco usare il equalprg vincolante in vim. Ciò consente di richiamare clang-format con G=gg o altre opzioni di rientro =.

appena messo il seguente nel file .vimrc:

autocmd FileType c,cpp setlocal equalprg=clang-format 
1

Volevo aggiungere, che al fine di evitare che venga incasinato in primo luogo è possibile digitare :set paste prima di incollare. Dopo aver incollato, puoi digitare :set nopaste per cose come js-beautify e indenting per lavorare di nuovo.

0

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

Problemi correlati