2010-10-12 3 views
18

Uso i file di tag per code completion e per una rapida visualizzazione in linea di parametri, sovraccarichi, file (dove dichiarato), ecc. Dove è possibile trovare tag liberamente disponibili per C99, C++ 03 e C++ 0x librerie standard? (C89 sarebbe meglio di niente, ma preferirei avere C99.)Etichette libreria standard

Preferisco i tag senza cruft; per esempio. le implementazioni usano nomi riservati per i parametri, quindi invece di "std :: min (_M_a, _M_b)", preferisco vedere "std :: min (a, b)". Questo e altri problemi escludono la generazione da implementazioni effettive. Anche se suppongo che un po 'di post-elaborazione possa pulirli (specialmente il problema dell'identificatore), sembra quasi che sarebbe più facile scrivere da zero.

+1

Freddo. Non avevo idea che tu potessi fare quelle cose in vim. –

+0

Parlare di tag, non dovrebbe essere C++ 1x? ;) –

+6

@jus: No.⁠⁠⁠⁠⁠⁠ –

risposta

2

Per quei requisiti esatti probabilmente si dovrà creare quelli soli :(

+2

Penso che dovrò mordere il proiettile e farlo, ma spero che il lavoro possa essere usato da altri. Ora sono circa a metà del C++ 03 stdlib e aggiornerò la domanda (per te o per chiunque altro sia interessato) in circa una settimana con un link. (Ehi, è nel mio tempo libero.;) –

2

generano da soli una libreria di tag utilizzando ctags sulle intestazioni dir, come scritto nel post del blog si collega nella tua domanda

+4

Come ho detto, "Questo esclude la generazione da implementazioni effettive." –

+0

@ Poger patè: questo non. In realtà il tuo unico modo è generare dall'implementazione. E non vedo alcun problema, in genere le conversioni utilizzate sono coerenti, quindi è facile eseguire la scansione degli identificatori riservati all'implementazione e convertirli in qualcosa di più carino. Le intestazioni MVS appaiono come se fossero * storpiate * con uno strumento automatico: alloc -> _Alloc ecc ... – ybungalobill

+1

@ybungalobill: Sembra ovvio, per me, questa risposta è stata scritta senza ulteriori letture che scremando la domanda. Se ho commesso un errore nelle mie ragioni * perché * generare da implementazioni non funziona per me, per favore, indicale quelle, ma questo sicuramente non risponde alla mia domanda. –

0

Questa non è una risposta completa. Qualcuno ha pubblicato un perl script to extract tags from SGI's STL documentation. Non include i nomi dei parametri di funzione. Dal momento che funziona sulla documentazione non c'è cruft. Spero che questo aiuti un po '.

+1

I documenti STL di SGI differiscono dalla libreria standard in molti modi. –

5

In genere è difficile estrarre i tag da libc perché è probabile che le dichiarazioni di funzione vengano implementate nelle intestazioni come macro complesse. Si può usare nm per trovare un elenco di simboli esportati da una libreria, ma che non indirizza l'elenco dei parametri.

Penso che la soluzione migliore è quella di analizzare la documentazione:

Ecco un elenco di tutte le funzioni e le macro esportate da libc in un formato facilmente analizzato:

http://www.gnu.org/s/libc/manual/html_node/Function-Index.html#Function-Index

ogni link di funzione a una pagina che elenca i parametri per quella funzione, anche in un formato prevedibile:

http://www.gnu.org/s/libc/manual/html_node/Block-Input_002fOutput.html#index-fread-1010

L'analisi delle pagine è piuttosto semplice utilizzando il modulo Python BeautifulSoup.

+0

Che dire dell'espansione macro usando il preprocessore C? – sellibitze

+0

Sarebbe una struttura semplice da creare. Sarebbe reso problematico perché potrebbe essere molto difficile prevedere i valori usati in "# if/# ifdef" che sono definiti in fase di esecuzione dal compilatore. Non consentirebbe inoltre l'estrazione dei parametri utilizzati nelle macro che hanno parametri variadici (ad esempio #define func (...)). –

+0

[È possibile visualizzare tutte le macro predefinite tramite le opzioni della riga di comando con alcuni compilatori.] (Http://stackoverflow.com/questions/75538/hidden-features-of-c/2339965#2339965) Doxygen esegue un'operazione simile alla preelaborazione , ma ha diverse opzioni per controllare la granularità. –

0

Se ottenere il completamento di librerie standard è il problema principale, il clang vim plugin fa questo abbastanza bene senza utilizzare i tag a tutti. V'è tuttavia ancora alcuni parametri "cruft" nei completamenti, in quanto utilizza i simboli utilizzati dal intestazione.

è principalmente basta semplicemente inserire un file in ~/.vim/plugin, installare clang, e funziona. Molto più semplice rispetto al percorso omnicomplete L'unico problema che ho avuto fino ad ora nel mio uso limitato è che a volte è lento a venire con i completamenti.