2013-03-07 20 views
20

Sono un principiante di Emacs. Devo provare a cercare su come usare Emacs per l'uso con grandi progetti C++, in particolare per indicizzare il codice e completare automaticamente i nomi delle funzioni e comportarmi come in Eclipse. Avevo usato Vim per un po 'di tempo in cui utilizzavo ctags per indicizzare il codice nel mio progetto e Vim era solito provare a completare automaticamente il mio codice usando un menu a discesa di opzioni. Sto cercando di ottenere lo stesso risultato con Emacs ora. Ma, durante la mia ricerca, i risultati hanno indicato CEDET e il completamento automatico e altri plug-in di terze parti.Emacs come IDE per grandi progetti C++

Ho provato a utilizzare ctags con ctags -e -R . e etags, ma senza successo.

Mi manca un modo predefinito di Emacs per ottenere lo stesso comportamento? Qual è il modo migliore e più semplice per ottenere ciò che voglio?

+0

Potresti voler controllare GNU global plus xgtags.el e clang basato sul completamento automatico. Semantic può fare uso di entrambi. – Arne

+0

Check out clang per il completamento automatico C++: http://root42.blogspot.hu/2012/07/nice-c-autocomplete-configuration-for.html – Tom

+0

Attualmente sto sviluppando ['clang-tags'] (https://github.com/ffevotte/clang-tags), uno strumento di indicizzazione basato su clang. È ancora nelle prime fasi dello sviluppo, ma potresti trovarlo utilizzabile. Se lo provi, sarei molto contento di ricevere un feedback su github. – Francesco

risposta

16

Io uso CEDET con il completamento automatico con esito positivo. Fondamentalmente, il completamento automatico è il provider della casella di riepilogo, e prende le sue fonti da varie cose, la cosa più interessante da CEDET (ma anche da etags e Gnu Global, che consiglio anche io).

Un buon punto di partenza per CEDET è di http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html

Alex Ott emacs config è lì: https://github.com/alexott/emacs-configs - è una risorsa utile.

Nota che è necessario prendere CEDET da bzr e installare/configurare il completamento automatico correttamente. Consiglio vivamente di installare la funzione di completamento automatico (e anche altre cose). Avrai bisogno di impostare progetti generici per EDE affinché il completamento automatico funzioni per file C/C++ casuali che non fanno parte di un progetto EDE strutturato.

Dovrai passare un po 'di tempo a configurare emacs, ma conviene. Lo strumento è incredibilmente produttivo una volta impostato correttamente.

+0

+1 per "Lo strumento è straordinariamente produttivo una volta impostato correttamente" –

+0

Potrei dover notare che non uso più CEDET, perché il parser C++ non è molto accurato e lento da morire. Ora utilizzo la modalità iron-based basata su libclang per il completamento e gtag per la navigazione. –

5

Dipende da ciò che si sta cercando in un IDE. Ho usato Emacs per un progetto C++ piuttosto grande. Naturalmente è necessario configurare emacs per funzionare come si desidera che funzioni in misura maggiore rispetto a qualsiasi altro IDE.

Ma sì CEDET è un inizio, anche se non è perfetto.

Tuttavia esiste una modalità di completamento automatico molto buona per Emacs http://cx4a.org/software/auto-complete/, non è intelisense ma dovrebbe integrarsi con CEDET in qualche modo per fornire un completamento automatico molto buono.

Un'altra funzione importante che utilizzo spesso è la funzione ff-find-other-file per saltare facilmente dall'intestazione e dai file di implementazione.

Quindi, ovviamente, è necessario eseguire il rollover del proprio bulid. CEDET ha qualche supporto per i progetti, ma non l'ho testato. Tuttavia Emacs si integra perfettamente con gli strumenti di compilazione della riga di comando come make. Gli errori vengono stampati in un buffer e puoi passare facilmente alla linea corretta all'interno di Emacs.

GDB si integra bene anche con Emacs M-x gdb, quindi ricorda solo il comando gdb-many-windows.

10

indicizzazione

Si potrebbe desiderare di utilizzare GNU/global invece di ctags: supporta C++ ed è, a mio parere più efficiente con i grandi progetti (soprattutto perché è possibile aggiornare l'indice invece di ricostruire da zero). Ed è ancora molto più semplice usare CEDET/Semantic (che è anche uno strumento fantastico se si impiega il tempo necessario per configurarlo).

uso Esempio:

$ cd sources 
$ gtags -v   # create the index 
$ cd subdirectory 
$ [hack hack hack] 
$ global -u  # update the index (can be called from anywhere in the project) 

In Emacs, attivare gtags-mode nei buffer di codice sorgente per ottenere l'accesso ai comandi gtags:

  • gtags-find-tag (M-.): Trovare la definizione del tag specificato nei file di origine (gtags consente di scegliere tra tutte le definizioni possibili se ce ne sono diverse o salta direttamente se esiste una sola possibilità)
  • gtags-pop-stack (M- *): ritorno alla posizione precedente
  • gtags-find-rtag: trovare tutti gli usi del tag specificato nei file di origine

Qui di seguito è la mia configurazione per gtags, che si attiva automaticamente se gtags-mode un indice viene trovato:

;; gtags-mode 
(eval-after-load "gtags" 
    '(progn 
    (define-key gtags-mode-map (kbd "M-,") 'gtags-find-rtag))) 
(defun ff/turn-on-gtags() 
    "Turn `gtags-mode' on if a global tags file has been generated. 

This function asynchronously runs 'global -u' to update global 
tags. When the command successfully returns, `gtags-mode' is 
turned on." 
    (interactive) 
    (let ((process (start-process "global -u" 
           "*global output*" 
           "global" "-u")) 
     (buffer (current-buffer))) 
    (set-process-sentinel 
    process 
    `(lambda (process event) 
     (when (and (eq (process-status process) 'exit) 
        (eq (process-exit-status process) 0)) 
      (with-current-buffer ,buffer 
      (message "Activating gtags-mode") 
      (gtags-mode 1))))))) 

(add-hook 'c-mode-common-hook 'ff/turn-on-gtags) 

Completamento automatico

Non conosco nessuno strumento migliore di auto-complete. Anche se non è incluso in Emacs, è molto facile da installare utilizzando il sistema di packaging (ad esempio nei repository marmalade o melpa).

Problemi correlati