Come ottenere il completamento automatico intelligente in C ++?


43

Emacs non può competere con un altro altro IDE se non ha una funzione di completamento automatico. Il completamento automatico mi rende semplicemente un programmatore più efficiente. Conosco l' estensione della modalità di completamento automatico , ma non funziona con C ++.

completamento automatico

Come posso ottenere il completamento automatico intelligente ed efficiente per C ++?


Questa domanda è stata originariamente posta da Malabarba sulla proposta di Area 51: Come ottenere il completamento automatico intelligente in C ++?


1
Sarebbe bello approfondire un po 'questa domanda. Ha molto valore potenziale, ma in questo momento la domanda è solo il titolo.
Malabarba,

La modalità ironia sembra essere la strada da percorrere in questo momento.
Sevki,

Risposte:


45

Disclaimer: sono l'autore della modalità ironia

screenshot di ironia dell'azienda

Se vuoi solo il completamento automatico intelligente, posso consigliare la modalità ironia con ironia aziendale .

  • la modalità ironia è facile da installare grazie a MELPA
  • il completamento è molto accurato e le prestazioni sono abbastanza decenti grazie a libclang
  • con ironia della compagnia hai un backend di completamento asincrono che non ti ostacolerà se il completamento richiede del tempo
  • company-ironia supporta funzioni sovraccaricate e se hai Yasnippet installato, gli argomenti della funzione vengono inseriti come segnaposto da compilare
  • se il tuo progetto utilizza Doxygen, la breve documentazione del candidato alla conclusione viene visualizzata nel minibuffer (vedi screenshot)
  • l'installazione del server in modalità ironia su un sistema simile a Unix (Linux, OS X) dovrebbe essere semplice. Windows d'altra parte richiede un po 'di modifiche ma è documentato nel wiki

Un altro strumento che non è stato ancora citato è emacs-ycmd .


2
Grazie mille! Vorrei che lo sapessi primairony-mode
Luca

@GuillaumePapin Grazie per aver scritto ironia! Ti piacerebbe avere a disposizione dei benchmark temporali? Ho notato che le chiamate a clang_codeCompleteAtcon una TU analizzata (ma modifiche non salvate) richiedono 3-5 secondi. È irony-modepiù veloce di questo?
Pradhan,

1
L'ironia usa libclang / clang_codeCompleteAt, quindi non avrai tempi migliori di così. 3-5 secondi possono essere troppo a seconda del contesto (ad es. I completamenti negli ambiti globali richiedono molto più tempo rispetto ad altri ambiti). Puoi dare un'occhiata ad alcuni tempi che ho fatto di recente: github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803
Guillaume Papin

Correlato, per i futuri lettori: github.com/Sarcasm/irony-mode/issues/140
Sean Allred

Come si confrontano i ruoli di ironia-modalità ed emacs-ycmd? Sono alternative l'una all'altra? Avrebbe mai senso usare entrambi?
Prassolitico

23

Controlla la mia guida . Elenca diversi metodi per il completamento automatico in C / C ++.

Queste opzioni sono:

  • Usando l' ironia . Altamente raccomandato, poiché utilizza Clang e facile da configurare rispetto ad altre soluzioni.

  • Utilizzando il parser integrato di Emacs. È il miglior completamento automatico che puoi ottenere dall'interno del parser Emacs, Semantic, ma sarebbe lento su grandi progetti come il kernel Linux.

  • Utilizzo del company-modepacchetto con company-clang. Fornisce il completamento del codice correttamente per i percorsi di inclusione del sistema poiché può ottenere automaticamente i percorsi da Clang, ma deve eseguire una configurazione per il progetto locale

  • Usando company-modecon company-gtags. Usa il database dei tag generato da GNU Global come completamento. Puoi usarlo per fornire il codice completo localmente al tuo progetto. Non è esattamente intelligente poiché ti lancia tutto all'interno del database generato.

  • rtagsva oltre fornendo un server per analisi dal vivo. Ma è complicato configurare il confronto con la pura soluzione Elisp.


Non sarei d'accordo sul fatto che impostare rtags sia più complicato di una soluzione emacs lisp pura. La soluzione puro emacs lisp di solito non considera i file cmake / build e difficilmente riesce a trovare alcuna intestazione. Rtags è abbastanza facile da configurare in confronto. È ancora un po 'giovane come progetto, con una copertura dei test non molto buona.
baol

Bella aggiunta alla guida di Tuhdo
Victor,

9

Ho avuto un grande successo con RTags + Company .

RTags ha bisogno di un demone separato in rdmesecuzione che utilizza clang per il completamento del codice, la navigazione del codice e il refactoring. rdmfunziona anche come un database di simboli, il che significa che il completamento automatico è molto più veloce di qualsiasi soluzione che chiama direttamente clang_codeCompleteAt.

RDM ha bisogno di informazioni di flag di compilazione per i vostri progetti, che può essere una seccatura, ma se si seguono i consigli dalla RTags page e link simbolico gcc-rtags-wrapper.sha gcc, g++, cce c++RDM viene automaticamente aggiornata con nuovi flag di compilazione su ricompilazione.


Sono appena passato dalla modalità ironia ai tag. La modalità ironia si interrompe costantemente e smette di funzionare dopo circa 15 minuti circa. Rtags sembra abbastanza buono finora e ha un'integrazione più pulita con yasnippet.
nenchev,

6

Soluzione 1: modalità azienda + clang

L'unico problema è che devi indicare alla modalità azienda dove cercare i file di intestazione c / c ++ del tuo progetto.

Se usi cmake, puoi lasciare che https://github.com/redguardtoo/cpputils-cmake esegua l'installazione per te (SUGGERIMENTO: sono l'autore di cpputils-cmake).

O

Soluzione 2: company-mode + gnu global

Nient'altro da dire, è necessario creare i tag con gnu global cli tool, come altri hanno già detto.


1

Ho usato cmake-ide per configurare rtags, flycheck, ironia e clang della compagnia.

Ora puoi configurare il tuo sistema di compilazione e i tuoi plug-in emacs preferiti per l'analisi statica allo stesso tempo!

EDIT: Nota che il clang della compagnia fornisce i completamenti automatici, che era la funzione che stavi cercando. cmake-ide può anche configurare flycheck e rtags, che aggiunge molte altre funzionalità simili a IDE.


1
Spiegare come questo risponde alla domanda su come ottenere il completamento automatico C ++.
Estratto il

@Drew company-clang fornisce completamenti
AnimatedRNG

Per favore, inseriscilo nella tua risposta. Grazie.
Estratto il

0

Mx modalità semantica

www.gnu.org/software/emacs/manual/html_node/semantic/Using-Semantic.html#Using-Semantic

&&

Tabelle di tag

trova . -name "*. [chCH]" -print | etags -

www.gnu.org/software/emacs/manual/html_node/emacs/Tags.html

etags , ctags - genera un file tag per Emacs, vi

manpages.debian.org/cgi-bin/man.cgi?query=etags&apropos=0&sektion=0&manpath=Debian+8+jessie&format=html&locale=en

CMi (o M-TAB) completamento nel punto. Se la modalità semantica è abilitata, prova a utilizzare i dati del parser semantico. Se la modalità semantica è disabilitata o non riesce, prova a completare utilizzando la tabella dei tag selezionata (vedi Tag)

http://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html#index-C_002dM_002di

M-. (trova-tag) richiede il nome del tag && passa alla definizione

http://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Tag.html#index-M_002d_002e

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.