2010-03-24 18 views
31

Sono piuttosto nuovo a VIM. Ho avuto qualche codice sorgente e questo è un casino. A prima vista mi piacerebbe almeno avere una visione chiara e organizzata del codice, quindi mi piace farlo correttamente formattato, intendo indentato a seconda della profondità delle funzioni e così via.È possibile formattare il codice C++ con VIM?

Mi chiedo se può essere fatto con VIM, e in caso contrario quali altri strumenti a riga di comando per quello che puoi consigliare.

Grazie

risposta

58

Mentre vim è un vero svizzero coltello io continuo a preferire strumenti esterni per alcuni lavori. Questo approccio è a volte molto più intuitivo e facile da ricordare rispetto all'utilizzo dell'equivalente integrato.

In caso di indentazione, filtro l'intero buffer di file tramite astyle. I parametri di astyle sono molto più facili da capire in un paio di minuti, specialmente se non sei un vim guru. Anche astyle offre molta più flessibilità nella messa a punto dell'output.

Per prima cosa installare astyle:
# apt-get install astyle

poi dentro vim:
:%!astyle (semplice caso - modalità di default astyle è C/C++)
o
:%!astyle --mode=c --style=ansi -s2 (ANSI C++ stile, utilizzare due spazi per livello di rientro)
o
:1,40!astyle --mode=c --style=ansi (ANSI C++ stile, filtra solo le righe 1-40)

+4

wow, questo è davvero grandioso, grazie mille – flow

+0

È possibile mappare questo a una combinazione di tasti come ctrl + shift + F? –

+4

Puoi anche eseguire l'override dell'operatore di rientro di Vim ('=') per usare Astyle impostando 'equalprg' su astyle (es:' set equalprg = ~/astyle \ --style = google') – Parsa

26

è possibile effettuare le seguenti operazioni:

gg=G 
+1

Per chiarire, = [movimento] fa rientrare la regione inglobata dal movimento. gg si sposta all'inizio del file e G si sposta alla fine del file. – Sarah

+1

o inizia con 'V' per entrare in modalità linea visiva, quindi vai giù con' j' per selezionare tutte le linee che vuoi formattare, quindi premi '=' – hasen

+1

Non mi piace 'gg = G'. Perché? Perché quando si rompe la lista lunga con le virgole (elenco di argomenti, lunghi booleani) si romperà l'allineamento manuale. – Benoit

4

Vim sarà sicuramente fare questo, anche se i risultati potrebbero non essere perfetta:

  1. In primo luogo, selezionare l'intero file in Visual modalità: ggVG
  2. Quindi premere = per reindire tutto.

Potete saperne di più sul comando di parità con: :help =

1

Una soluzione generica sulla falsariga dell'idea di m000 è quella di utilizzare UniversalIndentGUI come strumento esterno.

+0

grazie per le informazioni , ma preferisco VIM perché devo eseguire il debug del codice su macchine remote – flow

4

C'è un plugin vim che abilita la formattazione del codice da dentro a vim. Si chiama vim-formattazione automatica e si può scaricare qui:

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

Integra programmi in codice di formattazione esterni in vim. Ad esempio, se si desidera formattare il codice C, C++, C# o Java, è necessario installare il programma astyle e vim lo imposta automaticamente come programma di formattazione.

2

Non scrivo codice C++, ma scrivo codice Java.

Invece, Vim supporta la formattazione di alcune lingue comuni. Ho impostato una scorciatoia per me per formattare l'intero codice nel buffer. tornerà alla linea ho appena modificato :)

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

appena avuto a risolvere questo problema esatto, così ho pensato di contribuire a salvare gli altri un po 'di tempo.

È possibile utilizzare gg=G per indentare il codice. Ma le cose diventano difficili da capire nel momento in cui vuoi modificare come avviene l'indentazione automatica. Pertanto, se si cura solo che gli spazi bianchi errati vengano rimossi e non si preoccupino veramente dello stile di formattazione, gg=G è il modo più rapido per farlo, perché è integrato.

Se si desidera controllare lo stile (ad esempio, si sta tentando di rendere il codice conforme a a style guide), sarà necessario uno strumento esterno per elaborare il file. Puoi richiamare questo strumento da dentro con: :%!<toolname> <options>. Ciò convoglia il file attraverso lo strumento e ricarica il risultato elaborato. (Puoi ovviamente usarlo per qualsiasi altra cosa tu voglia fare al tuo file)

Quindi la prossima domanda è, quale strumento esterno dovresti scegliere? Indipendentemente da ciò, il metodo è lo stesso:

  1. installare lo strumento di scelta
  2. assicurarsi che il suo nel tuo percorso
  3. aggiungere una riga al vostro file vimrc che crea un tasto di scelta rapida da utilizzare in modo da risparmiare tempo
  4. Usalo.

Ora, quale strumento si utilizza dipende dallo stile che si sta tentando di replicare. Se stai cercando di replicare uno stile ampiamente utilizzato, è probabile che lo astyle sia tutto ciò di cui hai bisogno.

Se stai cercando di replicare uno stile personalizzato, allora si avrà bisogno di due cose:

  1. UniversalIndentGui - un front-end che permette di giocare con diverse opzioni e live-anteprima il loro effetto sulla fonte presentare
  2. Un insieme di strumenti di formattazione di origine codice installato e nel tuo percorso

Tra uncrustify e greatcode, si dovrebbe essere in grado di replicare completamente lo stile che si desidera.

In realtà, ho mentito. C'è un altro modo e si chiama clang-format. Tuttavia, vorrai leggere la documentazione su di esso e la sua ancora nelle prime fasi, quindi alcune opzioni non funzionano molto bene. È comunque uno strumento bellissimo (sicuramente il più intelligente del lotto perché costruisce un AST del tuo codice) ed è persino disponibile per Windows.

Se avete intenzione di leggere il manuale, volete anche dare un'occhiata allo GNU Indent.

Naturalmente, c'è l'ultimo modo, che in realtà richiede tempo per imparare le regole del rientro di Vim e scriverne uno per il tuo stile. Ci vorrà del tempo, ma funzionerà con gg=G.

Alcune note sul astyle vs Uncrustify vs greatcode:

  1. Astyle è un bene per la formattazione generale, ma non può fare le cose come allineare la dichiarazione di variabili e commenti ri-stile molto bene.
  2. Uncrustify può fare un sacco di cose che lo stile non può, ma essere pronti a passare un'ora a giocare finché non hai trovato la giusta combinazione di opzioni che ti servono. (Oppure se hai voglia di perdere un sacco di tempo, usa gli algoritmi genetici per capire la migliore combinazione di opzioni per il tuo stile e quando condividi il codice e dammi un link così posso usarlo :))

Si noti che non è necessario scegliere uno strumento. Con vim, puoi mappare una sequenza di tasti per eseguire più comandi in successione, quindi in teoria potresti usare una combinazione di questi strumenti per ottenere esattamente ciò che stai cercando.

Ultimo ma non meno importante, ecco un estratto dal mio file .vimrc, dove ho mappato F12 per richiamare astyle con alcune opzioni:

"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> 

Non giudicarmi sullo stile. Basta usare lo strumento per riprodurre ciò che desideri.

4

C'è anche un plugin Vim basandosi su clang-format: vim-clang-format

allora si può semplicemente assegnare il comando di formattazione a tutto ciò che più vi si addice.

13

Al giorno d'oggi consiglio vivamente il formato clang. Esso consente una semplice integrazione di clang formato in Vim, una volta che avete clang formato installato:

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

E 'l'unico beautifier codice che capisce veramente il vostro codice C++, ed è veramente intelligente per abbellire il codice più come un essere umano che come una macchina. Es .:

void TestFunction(int argument1, int argument2, 
        int argument3); 
void TestFunctionVeryLongName(int argument1, 
           int argument2, 
           int argument3); 
void TestFunctionWithRidiculouslyLongName(
    int argument1, int argument2, int argument3); 
+1

Un'alternativa alle combinazioni di tasti suggerite nel manuale in formato clang consiste nell'utilizzare l'associazione 'equalprg' in vim. Questo ti permette di invocare 'clang-format' con' G = gg' o altre opzioni '=' indent. Basta inserire quanto segue nel file '.vimrc': ' autocmd FileType c, cpp setlocal equalprg = clang-format' – Daniel

Problemi correlati