Wie bekomme ich eine intelligente automatische Vervollständigung in C ++?


43

Emacs kann nicht mit einer anderen IDE konkurrieren, wenn keine automatische Vervollständigungsfunktion vorhanden ist. Auto-Vervollständigung macht mich einfach zu einem effizienteren Programmierer. Ich kenne die Erweiterung Auto Complete Mode , aber sie funktioniert nicht mit C ++.

Autovervollständigen

Wie kann ich eine intelligente und effiziente Autovervollständigung für C ++ erreichen?


Diese Frage wurde ursprünglich von Malabarba zum Vorschlag für Area 51 gestellt: Wie erhalte ich eine intelligente automatische Vervollständigung in C ++?


1
Es wäre schön, diese Frage ein wenig zu vertiefen. Es hat eine Menge potenziellen Wert, aber im Moment ist die Frage nur der Titel.
Malabarba

Ironie-Modus scheint in dieser Zeit der richtige Weg zu sein.
Sevki

Antworten:


45

Disclaimer: Ich bin der Autor von Irony-Mode

Firmen-Ironie-Screenshot

Wenn Sie nur eine intelligente automatische Vervollständigung wünschen, kann ich den Ironie-Modus mit der Firmen-Ironie empfehlen .

  • Der Irony -Modus ist dank MELPA einfach zu installieren
  • Die Fertigstellung ist sehr genau und die Leistung dank libclang recht anständig
  • Mit Company Irony haben Sie ein asynchrones Abschluss- Backend, das Ihnen nicht im Weg steht, wenn der Abschluss einige Zeit in Anspruch nimmt
  • company-irony unterstützt überladene Funktionen. Wenn Sie Yasnippet installiert haben, werden die Funktionsargumente als Platzhalter zum Ausfüllen eingefügt
  • Wenn Ihr Projekt Doxygen verwendet, wird die Kurzdokumentation des Abschlusskandidaten im Minibuffer angezeigt (siehe Screenshot).
  • Die Installation des Irony-Mode-Servers auf einem Unix-ähnlichen System (Linux, OS X) sollte einfach sein. Windows hingegen erfordert einige Anpassungen, ist jedoch im Wiki dokumentiert

Ein weiteres Tool, das noch nicht erwähnt wurde, ist emacs-ycmd .


2
Ich danke dir sehr! Ich wünschte, ich hätte es früher herausgefundenirony-mode
Luke,

@ GuillaumePapin Vielen Dank für das Schreiben Ironie! Hätten Sie zufällig Timing-Benchmarks zur Verfügung? Ich habe festgestellt, dass Anrufe clang_codeCompleteAtmit einer analysierten TU (aber nicht gespeicherten Änderungen) 3-5 Sekunden dauern. Ist irony-modeschneller als das?
Pradhan

1
Irony verwendet libclang / clang_codeCompleteAt, so dass Sie keine besseren Zeiten bekommen. 3-5 Sekunden können kontextabhängig zu lang sein (z. B. dauern Abschlüsse in globalen Bereichen viel länger als in anderen Bereichen). Sie können sich einige Zeitangaben ansehen, die ich kürzlich gemacht habe: github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803
Guillaume Papin

Verwandte, für zukünftige Leser: github.com/Sarcasm/irony-mode/issues/140
Sean Allred

Wie vergleichen sich die Rollen von Irony-Mode und Emacs-Ycmd? Sind sie Alternativen zueinander? Wäre es jemals sinnvoll, beide zu verwenden?
Praxeolitic

23

Überprüfen Sie meinen Führer . Es werden verschiedene Methoden für die automatische Vervollständigung in C / C ++ aufgelistet.

Diese Optionen sind:

  • Mit Ironie . Sehr zu empfehlen, da es mit Clang arbeitet und im Vergleich zu anderen Lösungen einfach einzurichten ist.

  • Verwenden des integrierten Parsers von Emacs. Es ist die beste automatische Vervollständigung, die Sie erhalten können, und zwar im Emacs-Parser Semantic. Bei großen Projekten wie dem Linux-Kernel ist dies jedoch langsam.

  • Mit company-modePaket mit company-clang. Bietet Code-Vervollständigung für System-Include-Pfade, da die Pfade automatisch von Clang abgerufen werden können, jedoch einige Konfigurationsschritte für das lokale Projekt erforderlich sind

  • Verwenden company-modemit company-gtags. Als Abschluss wird die aus GNU Global generierte Tag-Datenbank verwendet. Sie können diesen verwenden, um Code vollständig lokal für Ihr Projekt bereitzustellen. Es ist nicht gerade intelligent, da es alles in der generierten Datenbank an Sie wirft.

  • rtagsWeiter geht es mit der Bereitstellung eines Servers für die Live-Analyse. Das Setup ist jedoch kompliziert und mit der reinen Elisp-Lösung zu vergleichen.


Ich würde nicht zustimmen, dass das Einrichten von rtags komplizierter ist als eine reine Emacs-Lisp-Lösung. Reine Emacs Lisp - Lösung in die Regel nicht berücksichtigen cmake / Build - Dateien und ist kaum in der Lage zu finden , jeden Kopf. Rtags sind im Vergleich dazu ziemlich einfach einzurichten. Es ist nur noch ein bisschen jung als Projekt, mit nicht sehr guter Testabdeckung.
Baol

Schöne Ergänzung zu Tuhdos Guide: syamajala.github.io/c-ide.html
Victor

9

Ich habe mit RTags + Company große Erfolge erzielt .

RTags benötigt einen separaten Daemon rdm, der clang für die Code-Vervollständigung, die Code-Navigation und das Refactoring verwendet. rdmfungiert auch als Datenbank mit Symbolen, was bedeutet, dass die automatische Vervollständigung viel schneller ist als jede Lösung, die nur direkt aufruft clang_codeCompleteAt.

Rdm braucht Informationen der Kompilation Fahnen für Ihre Projekte , die einen Streit sein, aber wenn Sie den Rat von der folgen rtags Seite und Symlink gcc-rtags-wrapper.shzu gcc, g++, ccund c++rdm automatisch mit neuen Compilation Flaggen auf recompile aktualisiert wird.


Ich bin gerade vom Ironiemodus auf Rtags umgestiegen. Der Irony-Modus bricht ständig ab und funktioniert nach etwa 15 Minuten nicht mehr. Rtags scheint bisher ziemlich gut zu sein und hat eine sauberere Integration mit yasnippet.
Nenchev

6

Lösung 1: Firmenmodus + Klicken

Das einzige Problem ist, dass Sie dem Firmenmodus mitteilen müssen, wo die c / c ++ - Header-Dateien Ihres Projekts durchsucht werden sollen.

Wenn Sie cmake verwenden, können Sie https://github.com/redguardtoo/cpputils-cmake das Setup für Sie durchführen lassen (TIPP: Ich bin der Autor von cpputils-cmake).

ODER

Lösung 2: firmenmodus + gnu global

Nichts weiter zu sagen, Sie müssen die Tags mit dem gnu global cli tool erstellen, wie bereits erwähnt.


1

Ich habe cmake-ide verwendet, um Rtags, Flycheck, Ironie und Company-Clang zu konfigurieren.

Jetzt können Sie Ihr Build-System und Ihre bevorzugten statischen Analyse-Emacs-Plugins gleichzeitig konfigurieren !

BEARBEITEN: Beachten Sie, dass Company-Clang Autovervollständigungen bereitstellt, nach denen Sie gesucht haben. cmake-ide kann auch Flycheck und rtags konfigurieren, wodurch mehrere weitere IDE-ähnliche Funktionen hinzugefügt werden.


1
Bitte erläutern Sie, wie dies die Frage beantwortet, wie die automatische Vervollständigung von C ++ erfolgen kann.
Drew

@ Drew Company-Clang bietet Abschlüsse
AnimatedRNG

Bitte schreiben Sie es in Ihre Antwort. Vielen Dank.
Drew

0

Mx-Semantikmodus

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

&&

Tags Tabellen

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

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

etags , ctags - Erzeugt eine Tag-Datei für Emacs, vi

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

CMi (oder M-TAB) -Vervollständigung am Punkt. Wenn der semantische Modus aktiviert ist, wird versucht, semantische Parserdaten zu verwenden. Wenn der semantische Modus deaktiviert ist oder fehlschlägt, wird versucht, den Vorgang mit der ausgewählten Tag-Tabelle abzuschließen (siehe Tags).

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

M-. (find-tag) fordert den Tag-Namen && auf, zur Definition zu springen

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.