Utilizzo di Emacs come IDE C / C ++ completo


50

Sto provando da oltre un anno a utilizzare Emacs come IDE C / C ++. Finora ho avuto un successo solo marginale, ma lungo la strada ho incontrato alcuni muri di mattoni. Attualmente sto cercando di usare CEDET, ma sto avendo difficoltà a capire come usarlo in modo efficace.

Le funzionalità che sto cercando in un IDE sono le seguenti:

  1. Gestione di "progetti" software Voglio che il mio IDE abbia un'idea di tutti i file che compongono il mio progetto attuale in modo da poter eseguire funzioni come ricerca e sostituzione all'interno del mio progetto. (Sarebbe bello se anche io potessi raggiungere questo obiettivo senza sporcare il mio albero dei sorgenti con molti file di supporto. Perché ho bisogno di più di un file di progetto centralizzato per progetto?)
  2. La possibilità di creare il progetto corrente dall'IDE, indipendentemente dal buffer che sto visitando. Devo essere in grado di associare una chiave che costruirà il progetto attuale.
  3. Segnalazione errori. Non voglio leggere oltre 500 righe di output per trovare gli errori segnalati dagli strumenti di compilazione. Preferibilmente, gli errori vengono visualizzati nel proprio buffer con una riga per errore.
  4. Una consapevolezza dei simboli all'interno del progetto e dove sono definiti. Voglio passare alla definizione di un simbolo se risiede nei miei file di progetto o nel file di inclusione del sistema.
  5. Debug visivo. Voglio avere una lista di variabili locali che si aggiornano automaticamente mentre passo attraverso il codice. Voglio essere in grado di impostare i punti di interruzione nel codice per vedere quale riga di codice verrà eseguita successivamente.

So che ognuna di queste funzionalità esiste perché ho avuto ciascuna di esse funzionante in un momento o in un altro utilizzando EDE, Semantic, GDB, ecc. Il problema è che non sono mai stato in grado di avere tutte queste funzionalità funzionanti contemporaneamente , perché di solito ogni pezzo deve essere configurato da solo, ed è di solito troppo lavoro per capire come configurarli tutti in una volta e farli lavorare insieme.

Quali soluzioni esistono per trasformare Emacs in un IDE C / C ++ completo? Devi sempre configurare tutto frammentariamente o c'è un modo per impostare tutte le funzionalità contemporaneamente?

EDIT: una buona risposta a questa domanda non deve soddisfare esattamente tutti e cinque i criteri indicati. Ho semplicemente fornito l'elenco per dare un'idea più concreta del tipo di funzionalità che voglio vedere prima di considerare un IDE "full optional". È del tutto possibile che CEDET possa adattarsi al conto, ma devo ancora trovare un tutorial passo-passo funzionante su come configurarlo da zero.


6
Questa domanda potrebbe essere meglio divisa in più. Potresti finire per avere un mucchio di risposte parziali, in cui nessuno degli elementi riceve l'attenzione che meritano.
Malabarba,

2
Inoltre, l'articolo 1 potrebbe essere un duplicato di emacs.stackexchange.com/questions/448/…
Malabarba,

6
@Malabarba: se facessi cinque domande separate, potrebbe essere un duplicato. Il punto centrale di questa domanda è che potrebbero esserci cinque diversi pacchetti che raggiungono i cinque diversi obiettivi, ma configurare tutti e cinque per giocare bene l'uno con l'altro sembra quasi impossibile. Se la risposta ritorna come "Emacs non può funzionare come un IDE completo perché ci vuole una quantità di tempo impossibile per la configurazione." allora così sia.
nispio,

4
Ognuno dei punti potrebbe essere la propria domanda (potenzialmente duplicata), metterli tutti insieme in una domanda a volte può portare a risposte diverse a causa dell'interazione del pacchetto.
Jonathan Leech-Pepin,

Risposte:


27

Esistono diversi livelli di "IDE-ness" per lingue diverse e, sfortunatamente, non otterrai mai funzionalità IDE complete senza alcuna configurazione (se non ti piace configurare le cose, probabilmente non dovresti usare Emacs). CEDET mira ad essere una soluzione completa che copre tutte le tue esigenze di lingue supportate, ma personalmente non l'ho mai fatto funzionare correttamente; invece, uso alcuni pacchetti in tandem per coprire le mie basi IDE. Esaminerò i tuoi punti in ordine, con alcune soluzioni per diverse lingue che conosco:

  1. proiettile è il pacchetto più vicino a fornire una vera esperienza simile all'IDE. Fornisce moltissime funzionalità utili in base al progetto. Probabilmente vorrai anche una sorta di gestione di finestre / aree di lavoro; Uso la mia soluzione chiamata wacspace , ma altre buone soluzioni includono prospettiva , gruppi di lavoro ed elscreen .
  2. Lingue diverse hanno idee diverse su cosa sia una "build", ma M-x compilepossono adattarsi praticamente a qualsiasi cosa e semplificare il paging tramite errori (basta usare next-error). È possibile personalizzare facilmente in base al progetto utilizzando le variabili di directory da impostare compile-command. È possibile eseguire compilecon proiettile utilizzando projectile-compile-project( C-c p c).
  3. M-x compileinoltre ha coperto qui - errori di solito finiscono uno per riga nel *compilation*tampone, con facile paginazione con next-error.
  4. Saltare su un simbolo implica "comprendere il tuo codice", ed è qui che il supporto varia enormemente attraverso le lingue. Per Elisp, puoi usare l'eccellente elisp-slime-nav , e poi M-.saltare alla definizione. Ecco alcuni pacchetti che forniscono un supporto simile per altre lingue: CIDER (per Clojure); SLIME (per Common Lisp); abito (per Ruby); tag semantici o clang per C / C ++ (disclaimer: non l'ho mai usato, quindi non ho idea se funzionano bene). Se tutto il resto fallisce, puoi anche usare le strutture TAGS integrate di Emacs usando qualcosa come esuberanti tag , ma con TAGS non ho mai avuto risultati quasi accettabili.
  5. Emacs ha un supporto molto sparso per i debugger. GDB con GUD è la soluzione migliore per linguaggi simili a C; in caso contrario, è praticamente interamente basato sulla lingua. (Non penso che il debug visivo tra lingue sia davvero un obiettivo realistico.)

4
Come nodo laterale projectilepuò essere integrato direttamente con la perspectivecreazione di uno perspective-per-projectswitch di progetto automaticamente.
Jonathan Leech-Pepin,

Vorrei aggiungere note sul semanticnumero 4, semantic è un ottimo pacchetto, capisce il tuo codice e può fare molte cose utili con quelle informazioni.
Jordon Biondo,

Non l'ho mai usato davvero semantic, e penso di ricordare che ha un supporto C ++ incompleto, ma l'ho aggiunto alla risposta.
shosti,

15

Ho usato questa guida per iniziare a usare Emacs come IDE C ++. Presenta Helm e Projectile che aiutano a rispondere a una serie di domande. Per dire,

  1. Projectile gestisce i progetti. Cerca nella struttura delle directory un Makefile, SConstruct, Git repo, repository SVN e forse altri file di sistema di build o controllo di versione per apprendere automaticamente quali file sono associati al progetto corrente. Ad esempio, C-c p hesegue helm-projectileche utilizza Helm per trovare un file nel progetto corrente.

  2. Projectile può costruire i tuoi progetti. C-c p cviene eseguito projectile-compile-projectche tenta di eseguire Make / SCons / CMake in base ai file disponibili. Non ho mai dovuto configurare questo; ha sempre saputo cosa fare.

  3. Gli errori vengono visualizzati nel proprio buffer quando si esegue, projectile-compile-projectma non sono sicuro che sia bello come si desidera.

  4. Puoi usare il pacchetto helm-gtagsche si interfaccia con il gtagsprogramma (che dovresti avere disponibile sul tuo sistema). Nota che gtags è un progetto GNU e quindi è improbabile che funzioni immediatamente su Windows.

    Una volta configurato, Helm viene a conoscenza dei simboli nel progetto e può navigare verso le definizioni e utilizzare le posizioni. Ad esempio, helm-gtags-dwimpuò passare a qualsiasi uso di una variabile o funzione e quando eseguito su un file di intestazione apre quel file di intestazione.

  5. Non l'ho ancora provato.

La guida elencata fornisce informazioni di configurazione molto esplicite su come iniziare.


Mi sono imbattuto anche in quella guida e l'ho applicata. IMHO è in qualche modo pesante e cambia troppo l'interazione di base con Emacs. Ho disabilitato una serie di configurazioni relative al timone perché interferivano con le solite scorciatoie (come aprire facilmente la directory corrente in un buffer o aprire un file in una sottodirectory con alcuni tasti). Vale la pena dare un'occhiata, però, ma probabilmente dovrebbe essere provato passo dopo passo, non nel suo insieme.
Stéphane Gourichon

9

Dal momento che stai chiedendo un IDE C / C ++ completo ora, potrei essere qualificato.

Ho usato tutti gli IDE di MS da vc4 a Visual Studio 2010, quindi capisco perfettamente cosa vuoi.

La buona notizia è che Emacs potrebbe essere buono al 95% rispetto a Visual Studio e può fare molto di più. ma potresti non essere interessato alla parte "altro". Quindi mi concentrerò solo sulle tue domande.

Ora il punto chiave, DEVI UTILIZZARE CMake , anche la tua applicazione C ++ è solo per Windows! Fine della storia. Nessun'altra scelta, so di cosa sto parlando. Se non usi CMake, è inutile continuare.

Risposta alla domanda 1 : Non è necessario impostare nulla, installare cpputils-cmake ( https://github.com/redguardtoo/cpputils-cmake ) che imposta altri plug-in. È ancora più conveniente di Visual Studio. Quindi non è necessaria l'installazione per progetto. Per quanto riguarda la ricerca, sostituisco la potenza di bash / perl / git e percol ( https://github.com/mooz/percol ), che è molto meglio di qualsiasi IDE. controlla il mio blog ( http://blog.binchen.org/categories/emacs.html ) e il mio ~ / .bashrc ( https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc ). Ad esempio, posso cercare di sostituire i file in un determinato commit.

Risposta alla domanda 2 : è già installato da cpputils-cmake, basta solo M-x compileil solito.

Risposta alla domanda 3 : uguale alla domanda 2. Non so perché questo sia un problema. è esattamente lo stesso comportamento di VS, con combinazioni di tasti migliori.

Risposta alla domanda 4 : ora la maggior parte delle persone usa Gnu Global, che potrebbe essere combinato con cpputils-cmake. Comprendo che il vero problema è rilevare automaticamente le directory contenenti tutte le intestazioni C ++ incluse . Questo può essere fatto con cpputils-cmake, tutto il resto è facile. Per favore man globalnella shell e leggi il manuale sulla variabile d'ambiente GTAGSLIBPATH. Ci sono molti plug-in per fornire una bella UX basata su Global per la navigazione del codice, consiglio ggtags.el

Risposta alla domanda 5 : Visual Debugging, molte persone hanno consigliato M-x gdb-many-window, l'ho provato ma non ha funzionato. È semplicemente perché la mia versione di gdb è obsoleta (suggerimento, sto usando OSX 10.7.3) e sono troppo pigra per aggiornare il mio sistema operativo. Ma GUD va bene. Creo qualche tasto breve per stampare la variabile per me nella finestra dell'editor. tutte le cose di debug sono utilizzabili. Non ha un layout UX tabella come VS. ma ad essere sincero con te. Anche il debugger di Microsoft UX non è il migliore al mondo. Il miglior debugger intuitivo è DDD ( http://www.gnu.org/software/ddd/). Gud e VS fanno entrambi schifo su questo problema. In questi giorni ho appena inserito il codice di registrazione con yasnippet che è un altro plug-in Emacs. Per chiarire, conosco tutti i trucchi avanzati sui punti di interruzione, è solo perché sono troppo pigro per applicare questi trucchi. L'inserimento del codice di registrazione in Emacs è molto più semplice.

Ci sono molte altre cose su IDE: completamento del codice? utilizzare la modalità azienda, non è necessaria alcuna configurazione. controllo della sintassi in tempo reale? allora usa cpputils-cmake(flymake-mode 1)

La cosa migliore è che devi fare meno setup di VS se usi il mio setup su ( https://github.com/redguardtoo/emacs.d ) Tale setup ha il titolo "purac's emacs configuration plus C / C ++ support" .

Ora c'è qualcosa che devo sottolineare, Emacs ti dà piena libertà . Puoi scegliere qualsiasi modo per iniziare. modo difficile o semplice.

Il modo più semplice è semplicemente copiare la mia configurazione (o la configurazione di chiunque su github, contare le stelle all'inizio), in 5 minuti avrai un IDE C ++ perfettamente funzionante. VS non ha terminato l'avvio in quei 5 minuti.

Il modo più difficile è modificare da zero l'installazione. Se scegli la via più difficile, allora non lamentarti Emacs . È la vostra scelta.

A proposito, a lungo termine, un po 'di conoscenza di Emacs Lisp potrebbe essere utile. Penso che sia banale per uno sviluppatore professionista C ++ rispetto al tempo che ho perso con MS sh * t. Molti anni fa MS ha aggiornato silenziosamente il runtime VC in alcuni aggiornamenti di Windows. Ha reso il mio prodotto funzionante su macchine aziendali ma si è schiantato sui computer dei clienti .

Dopo quell'incidente, ho iniziato a capire Richard Stallman.


1
Interessante. "DEVI UTILIZZARE CMake" -> Quindi, stai dicendo che quando si lavora su un pacchetto software gratuito casuale che utilizza autoconf o script personale, si dovrebbe scrivere un wrapper CMakeLists.txt?
Stéphane Gourichon

1
Puoi invece usare GNU Global, non perfetto come la soluzione cmake. Ma più flessibile, vedi blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin

5

Per il n. 4, consiglio vivamente i tag esuberanti e il supporto per i tag integrati, che utilizzo da anni. In alternativa, di recente sono passato all'utilizzo di GNU Global e del pacchetto ggtags e li ho trovati leggermente superiori; sebbene funzionino in modo quasi identico. Entrambi funzionano con quasi nessuna configurazione. Per altre funzionalità IDE, mi piace anche il pacchetto di completamento automatico. Allo stesso modo, utilizzo M-x compileampiamente e associo le chiavi globali all'errore successivo e precedente. Per la ricerca all'interno di "progetti", di solito uso solo M-x find-grep. Si noti che utilizzerà gli stessi collegamenti dei tasti per l'errore successivo e precedente.


4

Gestione di "progetti" software Voglio che il mio IDE abbia un'idea di tutti i file che compongono il mio progetto attuale in modo da poter eseguire funzioni come ricerca e sostituzione all'interno del mio progetto. (Sarebbe bello se anche io potessi raggiungere questo obiettivo senza sporcare il mio albero dei sorgenti con molti file di supporto. Perché ho bisogno di più di un file di progetto centralizzato per progetto?)

Il proiettile sembra l'opzione migliore per la gestione dei progetti in emacs. È estremamente leggero, non è necessario aggiungere alcun file aggiuntivo al progetto. Tenterà di rilevare automaticamente i progetti in base alla presenza di determinati file speciali. Ad esempio - se stai lavorando in un repository git, il proiettile lo tratterà come un progetto (tutti i file tracciati da git saranno trattati come parte del progetto), quindi sarai in grado di usare comandi come projectile-find-fileper aprire qualsiasi file del progetto. Ha un sacco di altri comandi che operano in base al progetto.

Segnalazione errori. Non voglio leggere oltre 500 righe di output per trovare gli errori segnalati dagli strumenti di compilazione. Preferibilmente, gli errori vengono visualizzati nel proprio buffer con una riga per errore.

Flycheck ha il supporto per il controllo della sintassi usando clang / gcc.

Una consapevolezza dei simboli all'interno del progetto e dove sono definiti. Voglio passare alla definizione di un simbolo se risiede nei miei file di progetto o nel file di inclusione del sistema

Ti consiglierei di dare un'occhiata ai tag . Usa il clang come backend e un buon lavoro nel saltare alla definizione e al completamento. Può anche aiutarti con il n. 3 poiché si integra anche con flymake per visualizzare errori e avvisi usando clang. Inoltre ha un supporto limitato per il refactoring. Un'altra opzione per il completamento automatico intelligente è la modalità ironia


2

La versione CEDET attualmente fornita con Emacs è difficile da configurare, ma quella che puoi ottenere sul sito ufficiale è più facile da configurare e potrebbe rispondere alle tue esigenze # 2 e # 4.

L'EDE di CEDET consente di gestire, ad esempio, progetti di makefile e automake, aggiungendovi target e associando file a target. È quindi possibile compilare il progetto utilizzando i comandi EDE. Poiché utilizza la modalità di compilazione integrata di Emacs, anche il tuo bisogno n. 3 è soddisfatto.

Semantic di CEDET ha parser per diverse lingue, incluso C ++. Può recuperare i tag definiti in un file, come exuberant-ctags e GNU Global, ma ha anche accurate funzionalità di auto-completamento e salto. Se hai due metodi chiamati "pippo", il salto di Semantic è abbastanza intelligente da portarti su quello giusto.

Per il n. 1, uso personalmente il proiettile e alcune volte fa ho usato con successo GDB per il n. 5.

Suggerimento per # 3: se EDE è eccessivo per te, Emacs ha il comando M-x recompiledi lanciare l'ultimo comando di compilazione, in modo da poter eseguire la compilazione una prima volta e quindi utilizzarlo recompilein qualsiasi buffer.


1

Per # 4, sembra essere un nuovo progetto chiamato YouCompleteme e il corrispondente client Emacs che sembra essere la prossima cosa interessante. Perché usa clang ha una visione migliore del codice rispetto ai tag o globale.


1
Grazie per il suggerimento, ma dal momento che sto cercando cose che si integrino bene insieme non sono sicuro che tentare di ottenere una delle funzionalità utilizzando un plug-in Vim con un client Emacs prototipo sia il miglior punto di partenza.
nispio,

3
Prova github.com/abingham/emacs-ycmd invece per il client emacs (nota che utilizza github.com/Valloric/ycmd , non github.com/Valloric/YouCompleteMe ). Funziona con la modalità azienda (consigliata da altre risposte qui), quindi si integra bene con il resto di Emacs. Puoi installare ycmd e company-ycmd da MELPA ( sprunge.us/LXGY è la mia configurazione); e segui le istruzioni di compilazione per ycmd. L'unica sfida è che devi mettere le tue bandiere di compilazione in un file come github.com/Valloric/ycmd/blob/master/examples/…
unhammer

1

Sono stato contento di CEDET dal repository di origine + BCE + gtags + cscope. Detto questo, ci sono molti suggerimenti su questo post che proverò.


1
Potresti spiegare cosa dovevi fare per far lavorare insieme tutti quegli strumenti?
nispio,

4
In questo momento sembra quasi un commento fuori posto. :-) Se vuoi essere gentile, ti preghiamo di elaborare un po '.
Malabarba,

Mi dispiace essere conciso. L'app StackExchange prende l'abitudine di usare dome. Questa soluzione risponde al n. 4, occupandosi della navigazione dei simboli e dell'analisi della fonte. CEDET, ovviamente, contiene semantico. BCE è il browser del codice Emacs e utilizza CEDET per elencare i metodi e riportare le informazioni sui simboli. Gtags e Cscope creano entrambi tabelle di informazioni sui simboli dalla base di origine (lo fa anche helm) e si integrano con Emacs per consentire la navigazione tramite tag o simboli.
Clay Haapala,

1

Come accennato in precedenza, il proiettile (facoltativamente con timone) è una soluzione brillante per la gestione del progetto.

Ycmd è ottimo per il completamento del codice e un po 'di navigazione, e il miglior client per questo è emacs-ycmd (divulgazione completa: ho scritto il client emacs.)

Per "tag" e indicizzazione, la migliore soluzione complessiva che ho trovato è la ricerca di codici (più informazioni: ho scritto anche questo.) È abbastanza stupido in quanto esegue semplicemente la ricerca di regex, ma è incredibilmente veloce e generalmente tutto ciò di cui hai bisogno e funziona bene in più lingue.

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.